From bcbf1684e2e040dec491a9386438ce5af8ab9104 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 14 Mar 2022 16:12:28 +0530 Subject: [PATCH 01/14] fix outdated targetplatforms in web --- .../extensions/browser/extensionsWorkbenchService.ts | 6 +++++- .../extensions/test/electron-browser/extension.test.ts | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index a6e9045425c..fd83df23a39 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -221,7 +221,11 @@ export class Extension implements IExtension { } get outdatedTargetPlatform(): boolean { - return !!this.local && !!this.gallery && this.local.targetPlatform !== TargetPlatform.UNDEFINED && this.local.targetPlatform !== this.gallery.properties.targetPlatform && semver.eq(this.latestVersion, this.version); + return !!this.local && !!this.gallery + && ![TargetPlatform.UNDEFINED, TargetPlatform.WEB].includes(this.local.targetPlatform) + && this.gallery.properties.targetPlatform !== TargetPlatform.WEB + && this.local.targetPlatform !== this.gallery.properties.targetPlatform + && semver.eq(this.latestVersion, this.version); } get telemetryData(): any { diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extension.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extension.test.ts index cb37de9dadd..de60b59fab1 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extension.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extension.test.ts @@ -56,6 +56,16 @@ suite('Extension Test', () => { assert.strictEqual(extension.outdated, true); }); + test('extension is not outdated when local and gallery are on same version and local is on web', () => { + const extension = instantiationService.createInstance(Extension, () => ExtensionState.Installed, undefined, aLocalExtension('somext', {}, { targetPlatform: TargetPlatform.WEB }), aGalleryExtension('somext')); + assert.strictEqual(extension.outdated, false); + }); + + test('extension is not outdated when local and gallery are on same version and gallery is on web', () => { + const extension = instantiationService.createInstance(Extension, () => ExtensionState.Installed, undefined, aLocalExtension('somext'), aGalleryExtension('somext', {}, { targetPlatform: TargetPlatform.WEB })); + assert.strictEqual(extension.outdated, false); + }); + test('extension is not outdated when local is not pre-release but gallery is pre-release', () => { const extension = instantiationService.createInstance(Extension, () => ExtensionState.Installed, undefined, aLocalExtension('somext', { version: '1.0.0' }), aGalleryExtension('somext', { version: '1.0.1' }, { isPreReleaseVersion: true })); assert.strictEqual(extension.outdated, false); From 9422f0a5686af6e46d1664384895cd71e34c2bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Mon, 14 Mar 2022 20:10:21 +0800 Subject: [PATCH 02/14] update Lua-grammar (#144975) * update Lua-grammar * Update test Co-authored-by: Alex Ross --- extensions/lua/cgmanifest.json | 2 +- extensions/lua/syntaxes/lua.tmLanguage.json | 8 ++------ .../test/colorize-results/test_lua.json | 20 +++++++++---------- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/extensions/lua/cgmanifest.json b/extensions/lua/cgmanifest.json index 432d82cc8bf..153296f8cce 100644 --- a/extensions/lua/cgmanifest.json +++ b/extensions/lua/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "sumneko/lua.tmbundle", "repositoryUrl": "https://github.com/sumneko/lua.tmbundle", - "commitHash": "9b79cbc54c3267065fca3d7b5b3845d1efbd091d" + "commitHash": "43da68bb99b948782e57985f633fa0c395190674" } }, "licenseDetail": [ diff --git a/extensions/lua/syntaxes/lua.tmLanguage.json b/extensions/lua/syntaxes/lua.tmLanguage.json index 23404451fc9..05c4b16814f 100644 --- a/extensions/lua/syntaxes/lua.tmLanguage.json +++ b/extensions/lua/syntaxes/lua.tmLanguage.json @@ -4,7 +4,7 @@ "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." ], - "version": "https://github.com/sumneko/lua.tmbundle/commit/9b79cbc54c3267065fca3d7b5b3845d1efbd091d", + "version": "https://github.com/sumneko/lua.tmbundle/commit/43da68bb99b948782e57985f633fa0c395190674", "name": "Lua", "scopeName": "source.lua", "patterns": [ @@ -170,10 +170,6 @@ "match": "(? Date: Mon, 14 Mar 2022 13:43:55 +0100 Subject: [PATCH 03/14] Sort comments in view by resource Part of microsoft/vscode-pull-request-github#3354 --- .../contrib/comments/common/commentModel.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/vs/workbench/contrib/comments/common/commentModel.ts b/src/vs/workbench/contrib/comments/common/commentModel.ts index a9c9fbf27ec..4986e959ffe 100644 --- a/src/vs/workbench/contrib/comments/common/commentModel.ts +++ b/src/vs/workbench/contrib/comments/common/commentModel.ts @@ -6,7 +6,7 @@ import { URI } from 'vs/base/common/uri'; import { IRange } from 'vs/editor/common/core/range'; import { Comment, CommentThread, CommentThreadChangedEvent } from 'vs/editor/common/languages'; -import { groupBy, flatten } from 'vs/base/common/arrays'; +import { groupBy } from 'vs/base/common/arrays'; import { localize } from 'vs/nls'; export interface ICommentThreadChangedEvent extends CommentThreadChangedEvent { @@ -71,9 +71,16 @@ export class CommentsModel { this.commentThreadsMap = new Map(); } + private updateResourceCommentThreads() { + this.resourceCommentThreads = [...this.commentThreadsMap.values()].flat(); + this.resourceCommentThreads.sort((a, b) => { + return a.resource.toString() > b.resource.toString() ? 1 : -1; + }); + } + public setCommentThreads(owner: string, commentThreads: CommentThread[]): void { this.commentThreadsMap.set(owner, this.groupByResource(owner, commentThreads)); - this.resourceCommentThreads = flatten([...this.commentThreadsMap.values()]); + this.updateResourceCommentThreads(); } public updateCommentThreads(event: ICommentThreadChangedEvent): boolean { @@ -123,7 +130,7 @@ export class CommentsModel { }); this.commentThreadsMap.set(owner, threadsForOwner); - this.resourceCommentThreads = flatten([...this.commentThreadsMap.values()]); + this.updateResourceCommentThreads(); return removed.length > 0 || changed.length > 0 || added.length > 0; } From 9212c3db3bf5585f9d316d513b63519b3db125fa Mon Sep 17 00:00:00 2001 From: Semphris Date: Sun, 13 Mar 2022 20:21:33 -0400 Subject: [PATCH 04/14] Update Seti theme --- extensions/theme-seti/cgmanifest.json | 2 +- extensions/theme-seti/icons/seti.woff | Bin 37204 -> 37204 bytes .../theme-seti/icons/vs-seti-icon-theme.json | 32 +++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/extensions/theme-seti/cgmanifest.json b/extensions/theme-seti/cgmanifest.json index e5fe1773015..00e2991fb96 100644 --- a/extensions/theme-seti/cgmanifest.json +++ b/extensions/theme-seti/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "seti-ui", "repositoryUrl": "https://github.com/jesseweed/seti-ui", - "commitHash": "921e46b4c378059032c2a9247a6cc96d0f9e57b4" + "commitHash": "8dba1bc311dad1b9bc23c4779149f3bf9baa8cb0" } }, "version": "0.1.0" diff --git a/extensions/theme-seti/icons/seti.woff b/extensions/theme-seti/icons/seti.woff index 05b5f72c2e4fbeb356ae00cd22128d3b32fef007..aeb87b845af6596a1b72e1590613ea35a538cc52 100644 GIT binary patch delta 59 zcmV-B0L1^)q5{;S0+5XZn-;3EkmZRb1Dp4j#Pi#HW#DFh0Tf}l7xGdXnP$Gs+z+HU R7??mj09bnq8nc>;x&~-18&CiM delta 59 zcmV-B0L1^)q5{;S0+5XZXE`FVkmZRbgVGf(@%%Pl8Mv8W07V$?S^Ww}rkO7@_X8;o R1||>>06nP+w6mIux(58_7t;U$ diff --git a/extensions/theme-seti/icons/vs-seti-icon-theme.json b/extensions/theme-seti/icons/vs-seti-icon-theme.json index 72f3c989c2a..41d2556aaa9 100644 --- a/extensions/theme-seti/icons/vs-seti-icon-theme.json +++ b/extensions/theme-seti/icons/vs-seti-icon-theme.json @@ -1781,10 +1781,16 @@ "karma.conf.js": "_karma", "karma.conf.coffee": "_karma", "readme.md": "_info", + "readme.txt": "_info", + "readme": "_info", "changelog.md": "_clock", + "changelog.txt": "_clock", "changelog": "_clock", "changes.md": "_clock", + "changes.txt": "_clock", + "changes": "_clock", "version.md": "_clock", + "version.txt": "_clock", "version": "_clock", "mvnw": "_maven", "tsconfig.json": "_tsconfig", @@ -1830,16 +1836,26 @@ "webpack.prod.cjs": "_webpack", "license": "_license", "licence": "_license", + "license.txt": "_license", + "licence.txt": "_license", "license.md": "_license", "licence.md": "_license", "copying": "_license", + "copying.txt": "_license", + "copying.md": "_license", "compiling": "_license_1", + "compiling.txt": "_license_1", + "compiling.md": "_license_1", "contributing": "_license_2", + "contributing.txt": "_license_2", + "contributing.md": "_license_2", "qmakefile": "_makefile_1", "omakefile": "_makefile_2", "cmakelists.txt": "_makefile_3", "procfile": "_heroku", "todo": "_todo", + "todo.txt": "_todo", + "todo.md": "_todo", "npm-debug.log": "_npm_ignored" }, "languageIds": { @@ -2239,10 +2255,16 @@ "karma.conf.js": "_karma_light", "karma.conf.coffee": "_karma_light", "readme.md": "_info_light", + "readme.txt": "_info_light", + "readme": "_info_light", "changelog.md": "_clock_light", + "changelog.txt": "_clock_light", "changelog": "_clock_light", "changes.md": "_clock_light", + "changes.txt": "_clock_light", + "changes": "_clock_light", "version.md": "_clock_light", + "version.txt": "_clock_light", "version": "_clock_light", "mvnw": "_maven_light", "tsconfig.json": "_tsconfig_light", @@ -2288,11 +2310,19 @@ "webpack.prod.cjs": "_webpack_light", "license": "_license_light", "licence": "_license_light", + "license.txt": "_license_light", + "licence.txt": "_license_light", "license.md": "_license_light", "licence.md": "_license_light", "copying": "_license_light", + "copying.txt": "_license_light", + "copying.md": "_license_light", "compiling": "_license_1_light", + "compiling.txt": "_license_1_light", + "compiling.md": "_license_1_light", "contributing": "_license_2_light", + "contributing.txt": "_license_2_light", + "contributing.md": "_license_2_light", "qmakefile": "_makefile_1_light", "omakefile": "_makefile_2_light", "cmakelists.txt": "_makefile_3_light", @@ -2300,5 +2330,5 @@ "npm-debug.log": "_npm_ignored_light" } }, - "version": "https://github.com/jesseweed/seti-ui/commit/921e46b4c378059032c2a9247a6cc96d0f9e57b4" + "version": "https://github.com/jesseweed/seti-ui/commit/8dba1bc311dad1b9bc23c4779149f3bf9baa8cb0" } \ No newline at end of file From 6e0be36443e86562f843d8406ac0fc706d784159 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 14 Mar 2022 14:41:54 +0100 Subject: [PATCH 05/14] Do not hard-code `Typing` as the label for `SingleModelEditStackElement` --- src/vs/editor/common/model/editStack.ts | 12 ++++++------ .../contrib/bulkEdit/browser/bulkTextEdits.ts | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/vs/editor/common/model/editStack.ts b/src/vs/editor/common/model/editStack.ts index bb67566ac5a..ad5a0f6d37d 100644 --- a/src/vs/editor/common/model/editStack.ts +++ b/src/vs/editor/common/model/editStack.ts @@ -161,11 +161,11 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement { return this.model.uri; } - public get label(): string { - return nls.localize('edit', "Typing"); - } - - constructor(model: ITextModel, beforeCursorState: Selection[] | null) { + constructor( + public readonly label: string, + model: ITextModel, + beforeCursorState: Selection[] | null + ) { this.model = model; this._data = SingleModelEditStackData.create(model, beforeCursorState); } @@ -413,7 +413,7 @@ export class EditStack { if (isEditStackElement(lastElement) && lastElement.canAppend(this._model)) { return lastElement; } - const newElement = new SingleModelEditStackElement(this._model, beforeCursorState); + const newElement = new SingleModelEditStackElement(nls.localize('edit', "Typing"), this._model, beforeCursorState); this._undoRedoService.pushElement(newElement); return newElement; } diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkTextEdits.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkTextEdits.ts index 737c8d2a00d..c4042b8aec8 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkTextEdits.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkTextEdits.ts @@ -249,7 +249,7 @@ export class BulkTextEdits { // This edit touches a single model => keep things simple const task = tasks[0]; if (!task.isNoOp()) { - const singleModelEditStackElement = new SingleModelEditStackElement(task.model, task.getBeforeCursorState()); + const singleModelEditStackElement = new SingleModelEditStackElement(this._label, task.model, task.getBeforeCursorState()); this._undoRedoService.pushElement(singleModelEditStackElement, this._undoRedoGroup, this._undoRedoSource); task.apply(); singleModelEditStackElement.close(); @@ -259,7 +259,7 @@ export class BulkTextEdits { // prepare multi model undo element const multiModelEditStackElement = new MultiModelEditStackElement( this._label, - tasks.map(t => new SingleModelEditStackElement(t.model, t.getBeforeCursorState())) + tasks.map(t => new SingleModelEditStackElement(this._label, t.model, t.getBeforeCursorState())) ); this._undoRedoService.pushElement(multiModelEditStackElement, this._undoRedoGroup, this._undoRedoSource); for (const task of tasks) { From 8a50a98acedbffab18473f59a1132fa6174731d2 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 14 Mar 2022 12:44:46 -0400 Subject: [PATCH 06/14] fix #145036 (#145040) --- .../browser/media/shellIntegration-bash.sh | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh index 964687b7854..adfdb1e634f 100755 --- a/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh +++ b/src/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh @@ -85,16 +85,14 @@ prompt_cmd_original() { STATUS="$?" if [[ "$ORIGINAL_PROMPT_COMMAND" =~ .+\;.+ ]]; then IFS=';' - read -ra ADDR <<<"$ORIGINAL_PROMPT_COMMAND" - for ((i = 0; i < ${#ADDR[@]}; i++)); do - eval ${ADDR[i]} - done - IFS='' else - for i in "${ORIGINAL_PROMPT_COMMAND[@]}"; do - eval $i - done + IFS=' ' fi + read -ra ADDR <<<"$ORIGINAL_PROMPT_COMMAND" + for ((i = 0; i < ${#ADDR[@]}; i++)); do + eval ${ADDR[i]} + done + IFS='' precmd } From 5a751e2bed0aed8d70926ba535f489860622a010 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 14 Mar 2022 12:44:58 -0400 Subject: [PATCH 07/14] fix #145044 (#145054) --- src/vs/workbench/contrib/terminal/browser/media/terminal.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/vs/workbench/contrib/terminal/browser/media/terminal.css b/src/vs/workbench/contrib/terminal/browser/media/terminal.css index 9702a0cc0c3..6605586e048 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/terminal.css +++ b/src/vs/workbench/contrib/terminal/browser/media/terminal.css @@ -93,6 +93,10 @@ display: block; } +.monaco-workbench .editor-instance .xterm { + padding-left: 20px !important; +} + .monaco-workbench .pane-body.integrated-terminal .terminal-group .monaco-split-view2.horizontal .split-view-view:first-child .xterm, .integrated-terminal.shell-integration .xterm { padding-left: 20px !important; From 04f6cdc4ff2dfc5988ed057573d4af1477de7072 Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Mon, 14 Mar 2022 12:45:30 -0400 Subject: [PATCH 08/14] support Copy as HTML in the terminal (#144784) --- .../contrib/terminal/browser/terminal.ts | 2 +- .../terminal/browser/terminalActions.ts | 14 ++++++++++ .../terminal/browser/terminalInstance.ts | 15 +++++++++-- .../contrib/terminal/browser/terminalMenus.ts | 26 +++++++++++++++++-- .../terminal/browser/xterm/xtermTerminal.ts | 19 ++++++++++++++ .../contrib/terminal/common/terminal.ts | 2 ++ 6 files changed, 73 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index cfc20e347b5..ca036c6f1b9 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -649,7 +649,7 @@ export interface ITerminalInstance { /** * Copies the terminal selection to the clipboard. */ - copySelection(): Promise; + copySelection(asHtml?: boolean): Promise; /** * Current selection in the terminal. diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index a05ec3f927d..ed19ad2653a 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -2113,6 +2113,20 @@ export function registerTerminalActions() { await accessor.get(ITerminalService).activeInstance?.copySelection(); } }); + registerAction2(class extends Action2 { + constructor() { + super({ + id: TerminalCommandId.CopySelectionAsHtml, + title: { value: localize('workbench.action.terminal.copySelectionAsHtml', "Copy Selection as HTML"), original: 'Copy Selection as HTML' }, + f1: true, + category, + precondition: ContextKeyExpr.and(ContextKeyExpr.or(TerminalContextKeys.processSupported, TerminalContextKeys.terminalHasBeenCreated), TerminalContextKeys.textSelected) + }); + } + async run(accessor: ServicesAccessor) { + await accessor.get(ITerminalService).activeInstance?.copySelection(true); + } + }); } if (BrowserFeatures.clipboard.readText) { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index c4b868836cb..dea2f9b1fff 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -1126,10 +1126,21 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { return this.xterm ? this.xterm.raw.hasSelection() : false; } - async copySelection(): Promise { + async copySelection(asHtml?: boolean): Promise { const xterm = await this._xtermReadyPromise; if (this.hasSelection()) { - await this._clipboardService.writeText(xterm.raw.getSelection()); + if (asHtml) { + const selectionAsHtml = await xterm.getSelectionAsHtml(); + function listener(e: any) { + e.clipboardData.setData('text/html', selectionAsHtml); + e.preventDefault(); + } + document.addEventListener('copy', listener); + document.execCommand('copy'); + document.removeEventListener('copy', listener); + } else { + await this._clipboardService.writeText(xterm.raw.getSelection()); + } } else { this._notificationService.warn(nls.localize('terminal.integrated.copySelection.noSelection', 'The terminal has no selection to copy')); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts index 94bbabfc054..5183542cb14 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts @@ -137,6 +137,17 @@ export function setupTerminalMenus(): void { order: 1 } }, + { + id: MenuId.TerminalInstanceContext, + item: { + command: { + id: TerminalCommandId.CopySelectionAsHtml, + title: localize('workbench.action.terminal.copySelectionAsHtml', "Copy as HTML") + }, + group: ContextMenuGroup.Edit, + order: 2 + } + }, { id: MenuId.TerminalInstanceContext, item: { @@ -145,7 +156,7 @@ export function setupTerminalMenus(): void { title: localize('workbench.action.terminal.paste.short', "Paste") }, group: ContextMenuGroup.Edit, - order: 2 + order: 3 } }, { @@ -237,6 +248,17 @@ export function setupTerminalMenus(): void { order: 1 } }, + { + id: MenuId.TerminalEditorInstanceContext, + item: { + command: { + id: TerminalCommandId.CopySelectionAsHtml, + title: localize('workbench.action.terminal.copySelectionAsHtml', "Copy as HTML") + }, + group: ContextMenuGroup.Edit, + order: 2 + } + }, { id: MenuId.TerminalEditorInstanceContext, item: { @@ -245,7 +267,7 @@ export function setupTerminalMenus(): void { title: localize('workbench.action.terminal.paste.short', "Paste") }, group: ContextMenuGroup.Edit, - order: 2 + order: 3 } }, { diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts index feec88f47ac..5bfb629b1be 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts @@ -7,6 +7,7 @@ import type { IBuffer, ITheme, RendererType, Terminal as RawXtermTerminal } from import type { ISearchOptions, SearchAddon as SearchAddonType } from 'xterm-addon-search'; import type { Unicode11Addon as Unicode11AddonType } from 'xterm-addon-unicode11'; import type { WebglAddon as WebglAddonType } from 'xterm-addon-webgl'; +import { SerializeAddon as SerializeAddonType } from 'xterm-addon-serialize'; import { IXtermCore } from 'vs/workbench/contrib/terminal/browser/xterm-private'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; @@ -42,6 +43,7 @@ const NUMBER_OF_FRAMES_TO_MEASURE = 20; let SearchAddon: typeof SearchAddonType; let Unicode11Addon: typeof Unicode11AddonType; let WebglAddon: typeof WebglAddonType; +let SerializeAddon: typeof SerializeAddonType; /** * Wraps the xterm object with additional functionality. Interaction with the backing process is out @@ -64,6 +66,7 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal { private _searchAddon?: SearchAddonType; private _unicode11Addon?: Unicode11AddonType; private _webglAddon?: WebglAddonType; + private _serializeAddon?: SerializeAddonType; private readonly _onDidRequestRunCommand = new Emitter(); readonly onDidRequestRunCommand = this._onDidRequestRunCommand.event; @@ -167,6 +170,15 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal { this.raw.loadAddon(this._decorationAddon); } + async getSelectionAsHtml(): Promise { + if (!this._serializeAddon) { + const Addon = await this._getSerializeAddonConstructor(); + this._serializeAddon = new Addon(); + this.raw.loadAddon(this._serializeAddon); + } + return this._serializeAddon.serializeAsHTML({ onlySelection: true }); + } + attachToElement(container: HTMLElement): HTMLElement { // Update the theme when attaching as the terminal location could have changed this._updateTheme(); @@ -404,6 +416,13 @@ export class XtermTerminal extends DisposableStore implements IXtermTerminal { return WebglAddon; } + protected async _getSerializeAddonConstructor(): Promise { + if (!SerializeAddon) { + SerializeAddon = (await import('xterm-addon-serialize')).SerializeAddon; + } + return SerializeAddon; + } + private _disposeOfWebglRenderer(): void { try { this._webglAddon?.dispose(); diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 3178608dd07..996cfcd801b 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -475,6 +475,7 @@ export const enum TerminalCommandId { RunRecentCommand = 'workbench.action.terminal.runRecentCommand', GoToRecentDirectory = 'workbench.action.terminal.goToRecentDirectory', CopySelection = 'workbench.action.terminal.copySelection', + CopySelectionAsHtml = 'workbench.action.terminal.copySelectionAsHtml', SelectAll = 'workbench.action.terminal.selectAll', DeleteWordLeft = 'workbench.action.terminal.deleteWordLeft', DeleteWordRight = 'workbench.action.terminal.deleteWordRight', @@ -566,6 +567,7 @@ export const DEFAULT_COMMANDS_TO_SKIP_SHELL: string[] = [ TerminalCommandId.ClearSelection, TerminalCommandId.Clear, TerminalCommandId.CopySelection, + TerminalCommandId.CopySelectionAsHtml, TerminalCommandId.DeleteToLineStart, TerminalCommandId.DeleteWordLeft, TerminalCommandId.DeleteWordRight, From 53aaa205e6eec5deb6f0069d4bdd8c0293f9da86 Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Mon, 14 Mar 2022 13:26:45 -0400 Subject: [PATCH 09/14] Fix #144605 --- extensions/git/src/repository.ts | 2 +- .../src/singlefolder-tests/commands.test.ts | 6 ++-- .../src/singlefolder-tests/window.test.ts | 14 +++++----- .../api/common/extHostDebugService.ts | 2 +- .../workbench/api/common/extHostEditorTabs.ts | 10 +++---- .../test/browser/extHostEditorTabs.test.ts | 28 +++++++++---------- src/vscode-dts/vscode.proposed.tabs.d.ts | 3 +- 7 files changed, 32 insertions(+), 33 deletions(-) diff --git a/extensions/git/src/repository.ts b/extensions/git/src/repository.ts index ecac68568c4..a276eaca322 100644 --- a/extensions/git/src/repository.ts +++ b/extensions/git/src/repository.ts @@ -1273,7 +1273,7 @@ export class Repository implements Disposable { const diffEditorTabsToClose: Tab[] = []; // Index - const tabs = window.tabGroups.all.map(g => g.tabs).flat(1); + const tabs = window.tabGroups.groups.map(g => g.tabs).flat(1); diffEditorTabsToClose.push(...tabs .filter(t => t.resource && t.resource.scheme === 'git' && t.kind === TabKind.Diff && diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts index 780ed8ddc1e..17b0139d6ef 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/commands.test.ts @@ -112,15 +112,15 @@ suite('vscode API - commands', () => { await commands.executeCommand('vscode.open', uri); assert.strictEqual(window.activeTextEditor?.viewColumn, ViewColumn.One); - assert.strictEqual(window.tabGroups.all[0].activeTab?.viewColumn, ViewColumn.One); + assert.strictEqual(window.tabGroups.groups[0].activeTab?.viewColumn, ViewColumn.One); await commands.executeCommand('vscode.open', uri, ViewColumn.Two); assert.strictEqual(window.activeTextEditor?.viewColumn, ViewColumn.Two); - assert.strictEqual(window.tabGroups.all[1].activeTab?.viewColumn, ViewColumn.Two); + assert.strictEqual(window.tabGroups.groups[1].activeTab?.viewColumn, ViewColumn.Two); await commands.executeCommand('vscode.open', uri, ViewColumn.One); assert.strictEqual(window.activeTextEditor?.viewColumn, ViewColumn.One); - assert.strictEqual(window.tabGroups.all[0].activeTab?.viewColumn, ViewColumn.One); + assert.strictEqual(window.tabGroups.groups[0].activeTab?.viewColumn, ViewColumn.One); let e1: Error | undefined = undefined; try { diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts index 3c1d22d5202..38565c017f5 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts @@ -383,12 +383,12 @@ suite('vscode API - window', () => { await window.showTextDocument(docC, { viewColumn: ViewColumn.Two, preview: false }); const tabGroups = window.tabGroups; - assert.strictEqual(tabGroups.all.length, 2); + assert.strictEqual(tabGroups.groups.length, 2); - const group1Tabs = tabGroups.all[0].tabs; + const group1Tabs = tabGroups.groups[0].tabs; assert.strictEqual(group1Tabs.length, 2); - const group2Tabs = tabGroups.all[1].tabs; + const group2Tabs = tabGroups.groups[1].tabs; assert.strictEqual(group2Tabs.length, 1); await group1Tabs[0].move(1, ViewColumn.One); @@ -397,7 +397,7 @@ suite('vscode API - window', () => { test('Tabs - vscode.open & vscode.diff', async function () { // Simple function to get the active tab const getActiveTab = () => { - return window.tabGroups.all.find(g => g.isActive)?.activeTab; + return window.tabGroups.groups.find(g => g.isActive)?.activeTab; }; const [docA, docB, docC] = await Promise.all([ @@ -420,7 +420,7 @@ suite('vscode API - window', () => { await commands.executeCommand('vscode.diff', leftDiff, rightDiff, 'Diff', { viewColumn: ViewColumn.Four, preview: false }); assert.strictEqual(getActiveTab()?.viewColumn, ViewColumn.Four); - const tabs = window.tabGroups.all.map(g => g.tabs).flat(1); + const tabs = window.tabGroups.groups.map(g => g.tabs).flat(1); assert.strictEqual(tabs.length, 5); assert.strictEqual(tabs[0].resource?.toString(), docA.uri.toString()); assert.strictEqual(tabs[1].resource?.toString(), docB.uri.toString()); @@ -451,7 +451,7 @@ suite('vscode API - window', () => { const rightDiff = await createRandomFile(); await commands.executeCommand('vscode.diff', leftDiff, rightDiff, 'Diff', { viewColumn: ViewColumn.Three, preview: false }); - const tabs = window.tabGroups.all.map(g => g.tabs).flat(1); + const tabs = window.tabGroups.groups.map(g => g.tabs).flat(1); assert.strictEqual(tabs.length, 5); // All resources should match the text documents as they're the only tabs currently open @@ -480,7 +480,7 @@ suite('vscode API - window', () => { // Function to acquire the active tab within the active group const getActiveTabInActiveGroup = () => { - const activeGroup = window.tabGroups.all.filter(group => group.isActive)[0]; + const activeGroup = window.tabGroups.groups.filter(group => group.isActive)[0]; return activeGroup.activeTab; }; diff --git a/src/vs/workbench/api/common/extHostDebugService.ts b/src/vs/workbench/api/common/extHostDebugService.ts index 26314660114..c0d3d9a3ea3 100644 --- a/src/vs/workbench/api/common/extHostDebugService.ts +++ b/src/vs/workbench/api/common/extHostDebugService.ts @@ -953,7 +953,7 @@ export class ExtHostVariableResolverService extends AbstractVariableResolverServ if (activeEditor) { return activeEditor.document.uri; } - const activeTab = editorTabs.tabGroups.all.find(group => group.isActive)?.activeTab; + const activeTab = editorTabs.tabGroups.groups.find(group => group.isActive)?.activeTab; if (activeTab !== undefined) { // Resolve a resource from the tab const asSideBySideResource = activeTab.resource as { primary?: URI; secondary?: URI } | undefined; diff --git a/src/vs/workbench/api/common/extHostEditorTabs.ts b/src/vs/workbench/api/common/extHostEditorTabs.ts index 5d6033c4849..e3b5fb3d5e9 100644 --- a/src/vs/workbench/api/common/extHostEditorTabs.ts +++ b/src/vs/workbench/api/common/extHostEditorTabs.ts @@ -33,7 +33,7 @@ export interface IEditorTabGroup { } export interface IEditorTabGroups { - all: IEditorTabGroup[]; + groups: IEditorTabGroup[]; activeTabGroup: IEditorTabGroup | undefined; readonly onDidChangeTabGroup: Event; readonly onDidChangeActiveTabGroup: Event; @@ -55,7 +55,7 @@ export class ExtHostEditorTabs implements IExtHostEditorTabs { private readonly _onDidChangeActiveTabGroup = new Emitter(); private _tabGroups: IEditorTabGroups = { - all: [], + groups: [], activeTabGroup: undefined, onDidChangeTabGroup: this._onDidChangeTabGroup.event, onDidChangeActiveTabGroup: this._onDidChangeActiveTabGroup.event @@ -71,7 +71,7 @@ export class ExtHostEditorTabs implements IExtHostEditorTabs { $acceptEditorTabModel(tabGroups: IEditorTabGroupDto[]): void { // Clears the tab groups array - this._tabGroups.all.length = 0; + this._tabGroups.groups.length = 0; let activeGroupFound = false; for (const group of tabGroups) { let activeTab: IEditorTab | undefined; @@ -82,7 +82,7 @@ export class ExtHostEditorTabs implements IExtHostEditorTabs { } return extHostTab; }); - this._tabGroups.all.push(Object.freeze({ + this._tabGroups.groups.push(Object.freeze({ isActive: group.isActive, viewColumn: typeConverters.ViewColumn.to(group.viewColumn), activeTab, @@ -93,7 +93,7 @@ export class ExtHostEditorTabs implements IExtHostEditorTabs { if (group.isActive) { activeGroupFound = true; const oldActiveTabGroup = this._tabGroups.activeTabGroup; - this._tabGroups.activeTabGroup = this._tabGroups.all[this._tabGroups.all.length - 1]; + this._tabGroups.activeTabGroup = this._tabGroups.groups[this._tabGroups.groups.length - 1]; // Diff the old and current active group to decide if we should fire a change event if (this.groupDiff(oldActiveTabGroup, this._tabGroups.activeTabGroup)) { this._onDidChangeActiveTabGroup.fire(this._tabGroups.activeTabGroup); diff --git a/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts b/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts index ed27b7b6dec..3a6be40a699 100644 --- a/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts +++ b/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts @@ -21,7 +21,7 @@ suite('ExtHostEditorTabs', function () { }) ); - assert.strictEqual(extHostEditorTabs.tabGroups.all.length, 0); + assert.strictEqual(extHostEditorTabs.tabGroups.groups.length, 0); assert.strictEqual(extHostEditorTabs.tabGroups.activeTabGroup, undefined); }); @@ -50,8 +50,8 @@ suite('ExtHostEditorTabs', function () { tabs: [tab], activeTab: { ...tab } }]); - assert.strictEqual(extHostEditorTabs.tabGroups.all.length, 1); - const [first] = extHostEditorTabs.tabGroups.all; + assert.strictEqual(extHostEditorTabs.tabGroups.groups.length, 1); + const [first] = extHostEditorTabs.tabGroups.groups; assert.ok(first.activeTab); assert.strictEqual(first.tabs.indexOf(first.activeTab), 0); @@ -63,8 +63,8 @@ suite('ExtHostEditorTabs', function () { tabs: [tab], activeTab: undefined! // TODO@lramos15 unused }]); - assert.strictEqual(extHostEditorTabs.tabGroups.all.length, 1); - const [first] = extHostEditorTabs.tabGroups.all; + assert.strictEqual(extHostEditorTabs.tabGroups.groups.length, 1); + const [first] = extHostEditorTabs.tabGroups.groups; assert.ok(first.activeTab); assert.strictEqual(first.tabs.indexOf(first.activeTab), 0); } @@ -84,8 +84,8 @@ suite('ExtHostEditorTabs', function () { tabs: [], activeTab: undefined }]); - assert.strictEqual(extHostEditorTabs.tabGroups.all.length, 1); - const [first] = extHostEditorTabs.tabGroups.all; + assert.strictEqual(extHostEditorTabs.tabGroups.groups.length, 1); + const [first] = extHostEditorTabs.tabGroups.groups; assert.strictEqual(first.activeTab, undefined); assert.strictEqual(first.tabs.length, 0); }); @@ -101,7 +101,7 @@ suite('ExtHostEditorTabs', function () { extHostEditorTabs.tabGroups.onDidChangeTabGroup(() => count++); - assert.strictEqual(extHostEditorTabs.tabGroups.all.length, 0); + assert.strictEqual(extHostEditorTabs.tabGroups.groups.length, 0); assert.strictEqual(extHostEditorTabs.tabGroups.activeTabGroup, undefined); assert.strictEqual(count, 0); extHostEditorTabs.$acceptEditorTabModel([{ @@ -113,7 +113,7 @@ suite('ExtHostEditorTabs', function () { }]); assert.ok(extHostEditorTabs.tabGroups.activeTabGroup); const activeTabGroup: IEditorTabGroup = extHostEditorTabs.tabGroups.activeTabGroup; - assert.strictEqual(extHostEditorTabs.tabGroups.all.length, 1); + assert.strictEqual(extHostEditorTabs.tabGroups.groups.length, 1); assert.strictEqual(activeTabGroup.tabs.length, 0); assert.strictEqual(count, 1); }); @@ -143,8 +143,8 @@ suite('ExtHostEditorTabs', function () { tabs: [tab], activeTab: { ...tab } }]); - assert.strictEqual(extHostEditorTabs.tabGroups.all.length, 1); - const [first] = extHostEditorTabs.tabGroups.all; + assert.strictEqual(extHostEditorTabs.tabGroups.groups.length, 1); + const [first] = extHostEditorTabs.tabGroups.groups; assert.ok(first.activeTab); assert.strictEqual(first.tabs.indexOf(first.activeTab), 0); assert.strictEqual(first.activeTab, first.tabs[0]); @@ -166,7 +166,7 @@ suite('ExtHostEditorTabs', function () { }); - assert.strictEqual(extHostEditorTabs.tabGroups.all.length, 0); + assert.strictEqual(extHostEditorTabs.tabGroups.groups.length, 0); assert.strictEqual(extHostEditorTabs.tabGroups.activeTabGroup, undefined); assert.strictEqual(count, 0); const tabModel = [{ @@ -240,7 +240,7 @@ suite('ExtHostEditorTabs', function () { tabs: [tabDto], activeTab: undefined // NOT needed }]); - let all = extHostEditorTabs.tabGroups.all.map(group => group.tabs).flat(); + let all = extHostEditorTabs.tabGroups.groups.map(group => group.tabs).flat(); assert.strictEqual(all.length, 1); const apiTab1 = all[0]; assert.strictEqual(apiTab1.resource?.toString(), URI.revive(tabDto.resource)?.toString()); @@ -258,7 +258,7 @@ suite('ExtHostEditorTabs', function () { activeTab: undefined // NOT needed }]); - all = extHostEditorTabs.tabGroups.all.map(group => group.tabs).flat(); + all = extHostEditorTabs.tabGroups.groups.map(group => group.tabs).flat(); assert.strictEqual(all.length, 1); const apiTab2 = all[0]; assert.strictEqual(apiTab2.resource?.toString(), URI.revive(tabDto.resource)?.toString()); diff --git a/src/vscode-dts/vscode.proposed.tabs.d.ts b/src/vscode-dts/vscode.proposed.tabs.d.ts index 292dfb2d6dc..7cc8d4acbf8 100644 --- a/src/vscode-dts/vscode.proposed.tabs.d.ts +++ b/src/vscode-dts/vscode.proposed.tabs.d.ts @@ -99,8 +99,7 @@ declare module 'vscode' { /** * All the groups within the group container */ - // TODO@API rename to groups - readonly all: TabGroup[]; + readonly groups: TabGroup[]; /** * The currently active group From 2959fcde6aa9ff2058ad13cef8a5265ddb5f58a4 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Mon, 14 Mar 2022 19:07:36 +0100 Subject: [PATCH 10/14] Fixes #143567: Use directly language ids --- .../common/services/languagesAssociations.ts | 45 +++++++++++++------ .../common/services/languagesRegistry.ts | 6 +-- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/vs/editor/common/services/languagesAssociations.ts b/src/vs/editor/common/services/languagesAssociations.ts index 58ad7c3719c..4912ff8c7cf 100644 --- a/src/vs/editor/common/services/languagesAssociations.ts +++ b/src/vs/editor/common/services/languagesAssociations.ts @@ -10,6 +10,7 @@ import { basename, posix } from 'vs/base/common/path'; import { DataUri } from 'vs/base/common/resources'; import { startsWithUTF8BOM } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; +import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; export interface ILanguageAssociation { readonly id: string; @@ -119,11 +120,27 @@ export function clearConfiguredLanguageAssociations(): void { userRegisteredAssociations = []; } +interface IdAndMime { + id: string; + mime: string; +} + /** * Given a file, return the best matching mime types for it * based on the registered language associations. */ export function getMimeTypes(resource: URI | null, firstLine?: string): string[] { + return getAssociations(resource, firstLine).map(item => item.mime); +} + +/** + * @see `getMimeTypes` + */ +export function getLanguageIds(resource: URI | null, firstLine?: string): string[] { + return getAssociations(resource, firstLine).map(item => item.id); +} + +function getAssociations(resource: URI | null, firstLine?: string): IdAndMime[] { let path: string | undefined; if (resource) { switch (resource.scheme) { @@ -141,7 +158,7 @@ export function getMimeTypes(resource: URI | null, firstLine?: string): string[] } if (!path) { - return [Mimes.unknown]; + return [{ id: 'unknown', mime: Mimes.unknown }]; } path = path.toLowerCase(); @@ -149,29 +166,29 @@ export function getMimeTypes(resource: URI | null, firstLine?: string): string[] const filename = basename(path); // 1.) User configured mappings have highest priority - const configuredLanguage = getMimeByPath(path, filename, userRegisteredAssociations); + const configuredLanguage = getAssociationByPath(path, filename, userRegisteredAssociations); if (configuredLanguage) { - return [configuredLanguage, Mimes.text]; + return [configuredLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }]; } // 2.) Registered mappings have middle priority - const registeredLanguage = getMimeByPath(path, filename, nonUserRegisteredAssociations); + const registeredLanguage = getAssociationByPath(path, filename, nonUserRegisteredAssociations); if (registeredLanguage) { - return [registeredLanguage, Mimes.text]; + return [registeredLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }]; } // 3.) Firstline has lowest priority if (firstLine) { - const firstlineLanguage = getMimeByFirstline(firstLine); + const firstlineLanguage = getAssociationByFirstline(firstLine); if (firstlineLanguage) { - return [firstlineLanguage, Mimes.text]; + return [firstlineLanguage, { id: PLAINTEXT_LANGUAGE_ID, mime: Mimes.text }]; } } - return [Mimes.unknown]; + return [{ id: 'unknown', mime: Mimes.unknown }]; } -function getMimeByPath(path: string, filename: string, associations: ILanguageAssociationItem[]): string | undefined { +function getAssociationByPath(path: string, filename: string, associations: ILanguageAssociationItem[]): ILanguageAssociationItem | undefined { let filenameMatch: ILanguageAssociationItem | undefined = undefined; let patternMatch: ILanguageAssociationItem | undefined = undefined; let extensionMatch: ILanguageAssociationItem | undefined = undefined; @@ -209,23 +226,23 @@ function getMimeByPath(path: string, filename: string, associations: ILanguageAs // 1.) Exact name match has second highest priority if (filenameMatch) { - return filenameMatch.mime; + return filenameMatch; } // 2.) Match on pattern if (patternMatch) { - return patternMatch.mime; + return patternMatch; } // 3.) Match on extension comes next if (extensionMatch) { - return extensionMatch.mime; + return extensionMatch; } return undefined; } -function getMimeByFirstline(firstLine: string): string | undefined { +function getAssociationByFirstline(firstLine: string): ILanguageAssociationItem | undefined { if (startsWithUTF8BOM(firstLine)) { firstLine = firstLine.substr(1); } @@ -242,7 +259,7 @@ function getMimeByFirstline(firstLine: string): string | undefined { const matches = firstLine.match(association.firstline); if (matches && matches.length > 0) { - return association.mime; + return association; } } } diff --git a/src/vs/editor/common/services/languagesRegistry.ts b/src/vs/editor/common/services/languagesRegistry.ts index 138fe2e8bb5..01b58ce512c 100644 --- a/src/vs/editor/common/services/languagesRegistry.ts +++ b/src/vs/editor/common/services/languagesRegistry.ts @@ -3,12 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { coalesce } from 'vs/base/common/arrays'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { compareIgnoreCase, regExpLeadsToEndlessLoop } from 'vs/base/common/strings'; -import { clearPlatformLanguageAssociations, getMimeTypes, registerPlatformLanguageAssociation } from 'vs/editor/common/services/languagesAssociations'; +import { clearPlatformLanguageAssociations, getLanguageIds, registerPlatformLanguageAssociation } from 'vs/editor/common/services/languagesAssociations'; import { URI } from 'vs/base/common/uri'; import { ILanguageIdCodec, LanguageId } from 'vs/editor/common/languages'; import { ModesRegistry, PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; @@ -362,7 +361,6 @@ export class LanguagesRegistry extends Disposable { if (!resource && !firstLine) { return []; } - const mimeTypes = getMimeTypes(resource, firstLine); - return coalesce(mimeTypes.map(mimeType => this.getLanguageIdByMimeType(mimeType))); + return getLanguageIds(resource, firstLine); } } From 4483c082e86087b1fc664eafb5008e94742e2c83 Mon Sep 17 00:00:00 2001 From: David Dossett Date: Mon, 14 Mar 2022 11:21:22 -0700 Subject: [PATCH 11/14] Fix #145067 --- .../common/media/dark.png | Bin 14165 -> 2277 bytes .../common/media/light.png | Bin 14341 -> 2225 bytes .../common/media/monokai.png | Bin 14287 -> 2256 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/common/media/dark.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/dark.png index bac2bc8d2d80329b01a1906e0266b503b46bc4f6..67ad6fcbd35fb0c87f7c4c2c1b829f6eb1c0aa73 100644 GIT binary patch literal 2277 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sV4T3g1{AUTd{GrhaTa()7BevDc!MzGQrl@O zfr5<1LGDfr>(0r%1aer?9eo`c7&i8E|4C$JVBo0oba4!+V0?R5u}`H`qW$4|Px+Mh z0l6Mwy-LdN0tOi(TzivDxmu4o2q>$s*f_)X$h?KON>-*lJ$1IN#PGLW{~F;vKbL;` z%fCK;|2{qj2FZ9{1_n(g0R{y(1}26h91aW(5{w)S0?G`G3`r~s3=TaEEDRlj4Gav1 zLrl?`hrbRUm-kzKxxo5$mE4M3+fFkSRErHR|2?y?uKxb+?wgk-R=gL!9Pi)He?V^E z|F`WoC$kcWk(+<{6b{6F+jp3CgE%+cqN#Y!+_`?s85tgw>7b;DH~;v7uDNHkU;al( z{`)xI8ckGr%wz?Lojqr(qiG*GeakOrGBCW@Kq!G9XYBa(d3iqjj^6imf3tu5C#a!4 zHFDkIylY==0=DK(XMFIDkf({tOJ@qpzJ2&$P+e71Bg4=jL`LN9-p|UjVfymr%NwV^ z`uDHyL2)FZ%v{dUs8fEWL5mE_XcPtvi}uxh{?1U-SAVb0Sbrv=>|m*Lx=6Nc^SbAa zt8#bqFl-Y&0}A+?X3~Rop~s} zopJX*Q(Z;H3|m_}J3a=7P83O+merPg4p%N;zI@>MuKoMvD^?Op-DeUbr@h`VyVRCH zB=>eI!wy?AQWN#+7+_|u`uwNv!P1KA?^zG_ClN{ze5W_XwBKFxx^h9*Z9V1#Zwcm^ j;ZaKxRV0BG{S*(E%o5q8+4ddSDq-++^>bP0l+XkKzz*ko literal 14165 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 Gq5lURohw@a diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/common/media/light.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/light.png index 81aa74dc4de3356a4e08f2c718061dfe20bd7f9b..14a472108e510fd1908ca64fe17e5b491506d970 100644 GIT binary patch literal 2225 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%0ASBCcObGd5?`qN0Z1Q%qBYm$o{^F$hItfd=okDf zRso5s^tuiy9xd}o`@ca51S$1^g-2Ej+t$)}oRwgaxRp;)vJ*oMfy}rT;QK9Dfr_mJ zUCs@CydYRRuZrpMvpb?zc)1%upkcs#cx3+T8Y+>$lKh4Z6US%CM zvNzw_{tyR$jmSOg3l9`7-Mc@_-dU8Q!SrAjAsTh}-D^e_WSE*=;TyUkRfWZr)qRV@ zDvMI>L*36OCYLLlFO{3QpTwau~T%c*#R72 zH<#Z5a$1Hg5`)lzc|iw%uRaDqIxYou1~X6G?i-)gdJ5{Rw)t`iOh8(?JV0{IomuAJAx_BOAWl60-l>UnO{)r49gUyfTZP?Qh zfHd+|aY`Yh*GWxlg*aMrn{j9cBN1=QBW4NeqP{rd2&8psw zugza3Tz6t>O(g!*&O4x-)S8xMWt@L=kI$kuz?iqsY^XtDi9kkoog?}W{(&&icr(zr z3d@{zhs~#zOin}su%`WL%@0)E06XdRuvA6;nZMBm0AtW;4iCb~`&|1;>;S7pUR|CA zwK#xIiN(CZh@UWk92e38;>^4aPee5@GSd>bsAF$Q zHNmy7x>d#NuU&%|5qBomghSXJmteF%>oOw=YPY+Z4HObft$)S3NnkW3claQ#dvGj? z7r4V~A<|~C!2j1`0RwQcZD|IA)-kT&xE=5_-T=={@bCIp@Q((fxiR7ozGhHwKAHkt z!G7$$%y%$f^*1nY3u?;yqkcvJsj1ph>&7R#CEvk0nCxnEPho)QZ@Dvrf}ER%~+$2}jANDExIzkhwYSbfD?zNl=A^0n$$3*`Qdb?-sa z;!)4avtA##VhS~Pz;y8_Yqj4yivplzN0|QK%-0+QW@%h0cKY|8r5h;jEkJjY zHu{e~Bn_2i{eM}eHhcezsOWz#W#HX!DK_)$xY4c8z^6HLu?Kz>RO$#R@a{L9b{9^j z7Y@u1nr}A&qCb)<0cGk_RfTTJ9sal^nfX|HX9H{c@u{-ZKDzP0qRph829<#VfJ z1uYA~tg~Fc_knJwz}jEB^;QI!O!2VhRuFLz4WKap1q;W|!(j90lY%8cn;Ugw$M0~j z`#ms+_Y&(E(CfC4{=`%Trm6?8`L511$Qo+YjrWw4tS(Mw2C~s`bcO-v z4qh3_?x~GrUqsuz7Gx@?Y^?U^3I`R|zKuCD@QU^mZ2pz5W}N0OOv~987e4`NG1Bb3 z#smOzGw5qXOj`a4PO$&P1o1Cs_)i5n=p%SbizbK{GptI|&3!tDGNj4%>?H8H$K|q= zLD>8k*7X<548XlLH@Y%i*h7}*m#fQ0%ouu?XRA70*5|VA-A$6!DnKG%XUo`!LkI1Q zqa;+b!$HW%3t99jj-)I!vD?kc!o6jtNEH8-f~w`Radyh*EDNjJsa4Q&`B=vJd-M7` z#O{3szLZ-6mGieRA-;8RZ|VW3Y~AbQP6g9DHv#pxUyIl!0BBj*WYG&?eBK|;!W2;? zM%>v0;j@MC@xp(D4E6YH(=El6jfEc2=jZU{#fgU;q!@0@FqawjfXF9byO!>2( zfZ+bE5I28Z^q*eR{>Rne|1$hgP(^L zSoD_r&5~zkW_YTGm0~5Px-aB8yH>3)YzcX9xaFqQRJ~MQV?|mj=)(>)!Yh|PMN!y^ z3S}jup#1v&!$LUoT0bR}Pc4)B3yJSz%|}2H)%C(68T52P&_>3irmFN()Or_3ALN79 PEJW|%(F3{rtwa9@81|s` diff --git a/src/vs/workbench/contrib/welcomeGettingStarted/common/media/monokai.png b/src/vs/workbench/contrib/welcomeGettingStarted/common/media/monokai.png index ea0926178e0f8abd66e0665c996ed3b7cb8b942b..68c4aff78b1758eb620694bdda0607c4b8b4e43d 100644 GIT binary patch literal 2256 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 E1BYg#Bme*a From 6db78b59f93258c94fd051aecc34c822c33362a9 Mon Sep 17 00:00:00 2001 From: Raymond Zhao Date: Mon, 14 Mar 2022 11:45:20 -0700 Subject: [PATCH 12/14] Add manual reset flag for settings update event (#144429) Ref https://github.com/microsoft/vscode/issues/58038 This flag could also come in useful for language overrides. --- .../preferences/browser/settingsEditor2.ts | 20 ++++++++++--------- .../preferences/browser/settingsTree.ts | 12 ++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index 7e598f83d5b..ed4b20be0c8 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -788,7 +788,7 @@ export class SettingsEditor2 extends EditorPane { private createSettingsTree(container: HTMLElement): void { this.settingRenderers = this.instantiationService.createInstance(SettingTreeRenderers); - this._register(this.settingRenderers.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value, e.type))); + this._register(this.settingRenderers.onDidChangeSetting(e => this.onDidChangeSetting(e.key, e.value, e.type, e.manualReset))); this._register(this.settingRenderers.onDidOpenSettings(settingKey => { this.openSettingsFile({ revealSetting: { key: settingKey, edit: true } }); })); @@ -869,16 +869,16 @@ export class SettingsEditor2 extends EditorPane { })); } - private onDidChangeSetting(key: string, value: any, type: SettingValueType | SettingValueType[]): void { + private onDidChangeSetting(key: string, value: any, type: SettingValueType | SettingValueType[], manualReset: boolean): void { if (this.pendingSettingUpdate && this.pendingSettingUpdate.key !== key) { - this.updateChangedSetting(key, value); + this.updateChangedSetting(key, value, manualReset); } this.pendingSettingUpdate = { key, value }; if (SettingsEditor2.shouldSettingUpdateFast(type)) { - this.settingFastUpdateDelayer.trigger(() => this.updateChangedSetting(key, value)); + this.settingFastUpdateDelayer.trigger(() => this.updateChangedSetting(key, value, manualReset)); } else { - this.settingSlowUpdateDelayer.trigger(() => this.updateChangedSetting(key, value)); + this.settingSlowUpdateDelayer.trigger(() => this.updateChangedSetting(key, value, manualReset)); } } @@ -948,7 +948,7 @@ export class SettingsEditor2 extends EditorPane { return ancestors.reverse(); } - private updateChangedSetting(key: string, value: any): Promise { + private updateChangedSetting(key: string, value: any, manualReset: boolean): Promise { // ConfigurationService displays the error if this fails. // Force a render afterwards because onDidConfigurationUpdate doesn't fire if the update doesn't result in an effective setting value change const settingsTarget = this.settingsTargetsWidget.settingsTarget; @@ -956,11 +956,13 @@ export class SettingsEditor2 extends EditorPane { const configurationTarget = (resource ? ConfigurationTarget.WORKSPACE_FOLDER : settingsTarget); const overrides: IConfigurationOverrides = { resource }; - const isManualReset = value === undefined; + const configurationTargetIsWorkspace = configurationTarget === ConfigurationTarget.WORKSPACE || configurationTarget === ConfigurationTarget.WORKSPACE_FOLDER; - // If the user is changing the value back to the default, do a 'reset' instead + const isManualReset = configurationTargetIsWorkspace ? manualReset : value === undefined; + + // If the user is changing the value back to the default, and we're not targeting a workspace scope, do a 'reset' instead const inspected = this.configurationService.inspect(key, overrides); - if (inspected.defaultValue === value) { + if (!configurationTargetIsWorkspace && inspected.defaultValue === value) { value = undefined; } diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 83c3b881206..bfc5db90916 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -656,6 +656,7 @@ export interface ISettingChangeEvent { key: string; value: any; // undefined => reset/unconfigure type: SettingValueType | SettingValueType[]; + manualReset: boolean; } export interface ISettingLinkClickEvent { @@ -782,7 +783,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre const descriptionElement = DOM.append(container, $('.setting-item-description')); const modifiedIndicatorElement = DOM.append(container, $('.setting-item-modified-indicator')); - modifiedIndicatorElement.title = localize('modified', "Modified"); + modifiedIndicatorElement.title = localize('modified', "The setting has been configured in the current scope."); const valueElement = DOM.append(container, $('.setting-item-value')); const controlElement = DOM.append(valueElement, $('div.setting-item-control')); @@ -883,7 +884,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre template.miscLabel.updateOtherOverrides(element, template.elementDisposables, this._onDidClickOverrideElement); - const onChange = (value: any) => this._onDidChangeSetting.fire({ key: element.setting.key, value, type: template.context!.valueType }); + const onChange = (value: any) => this._onDidChangeSetting.fire({ key: element.setting.key, value, type: template.context!.valueType, manualReset: false }); const deprecationText = element.setting.deprecationMessage || ''; if (deprecationText && element.setting.deprecationMessageIsMarkdown) { const disposables = new DisposableStore(); @@ -1449,7 +1450,8 @@ export class SettingExcludeRenderer extends AbstractSettingRenderer implements I this._onDidChangeSetting.fire({ key: template.context.setting.key, value: Object.keys(newValue).length === 0 ? undefined : sortKeys(newValue), - type: template.context.valueType + type: template.context.valueType, + manualReset: false }); } } @@ -1765,7 +1767,7 @@ export class SettingBoolRenderer extends AbstractSettingRenderer implements ITre const controlElement = DOM.append(descriptionAndValueElement, $('.setting-item-bool-control')); const descriptionElement = DOM.append(descriptionAndValueElement, $('.setting-item-description')); const modifiedIndicatorElement = DOM.append(container, $('.setting-item-modified-indicator')); - modifiedIndicatorElement.title = localize('modified', "Modified"); + modifiedIndicatorElement.title = localize('modified', "The setting has been configured in the current scope."); const deprecationWarningElement = DOM.append(container, $('.setting-item-deprecation-message')); @@ -1904,7 +1906,7 @@ export class SettingTreeRenderers { new Action('settings.resetSetting', localize('resetSettingLabel', "Reset Setting"), undefined, undefined, async context => { if (context instanceof SettingsTreeSettingElement) { if (!context.isUntrusted) { - this._onDidChangeSetting.fire({ key: context.setting.key, value: undefined, type: context.setting.type as SettingValueType }); + this._onDidChangeSetting.fire({ key: context.setting.key, value: undefined, type: context.setting.type as SettingValueType, manualReset: true }); } } }), From 43ebce7ce2185c8100175305818d7e42079f7a3e Mon Sep 17 00:00:00 2001 From: Ladislau Szomoru <3372902+lszomoru@users.noreply.github.com> Date: Mon, 14 Mar 2022 19:53:24 +0100 Subject: [PATCH 13/14] Use markdown for the timeline hover (#145038) --- extensions/git/src/timelineProvider.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/extensions/git/src/timelineProvider.ts b/extensions/git/src/timelineProvider.ts index bfedf9155c5..3e804a16f6e 100644 --- a/extensions/git/src/timelineProvider.ts +++ b/extensions/git/src/timelineProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vscode-nls'; -import { CancellationToken, ConfigurationChangeEvent, Disposable, env, Event, EventEmitter, ThemeIcon, Timeline, TimelineChangeEvent, TimelineItem, TimelineOptions, TimelineProvider, Uri, workspace } from 'vscode'; +import { CancellationToken, ConfigurationChangeEvent, Disposable, env, Event, EventEmitter, MarkdownString, ThemeIcon, Timeline, TimelineChangeEvent, TimelineItem, TimelineOptions, TimelineProvider, Uri, workspace } from 'vscode'; import { Model } from './model'; import { Repository, Resource } from './repository'; import { debounce } from './decorators'; @@ -50,6 +50,20 @@ export class GitTimelineItem extends TimelineItem { return this.shortenRef(this.previousRef); } + setItemDetails(author: string, email: string | undefined, date: string, message: string): void { + this.detail = new MarkdownString('', true); + + if (email) { + const emailTitle = localize('git.timeline.email', "Email"); + this.detail.appendMarkdown(`$(account) [**${author}**](mailto:${email} "${emailTitle} ${author}")\n\n`); + } else { + this.detail.appendMarkdown(`$(account) **${author}**\n\n`); + } + + this.detail.appendMarkdown(`$(history) ${date}\n\n`); + this.detail.appendMarkdown(message); + } + private shortenRef(ref: string): string { if (ref === '' || ref === '~' || ref === 'HEAD') { return ref; @@ -167,7 +181,8 @@ export class GitTimelineProvider implements TimelineProvider { if (showAuthor) { item.description = c.authorName; } - item.detail = `${c.authorName} (${c.authorEmail}) \u2014 ${c.hash.substr(0, 8)}\n${dateFormatter.format(date)}\n\n${message}`; + + item.setItemDetails(c.authorName!, c.authorEmail, dateFormatter.format(date), message); const cmd = this.commands.resolveTimelineOpenDiffCommand(item, uri); if (cmd) { @@ -192,7 +207,7 @@ export class GitTimelineProvider implements TimelineProvider { // TODO@eamodio: Replace with a better icon -- reflecting its status maybe? item.iconPath = new ThemeIcon('git-commit'); item.description = ''; - item.detail = localize('git.timeline.detail', '{0} \u2014 {1}\n{2}\n\n{3}', you, localize('git.index', 'Index'), dateFormatter.format(date), Resource.getStatusText(index.type)); + item.setItemDetails(you, undefined, dateFormatter.format(date), Resource.getStatusText(index.type)); const cmd = this.commands.resolveTimelineOpenDiffCommand(item, uri); if (cmd) { @@ -214,7 +229,7 @@ export class GitTimelineProvider implements TimelineProvider { // TODO@eamodio: Replace with a better icon -- reflecting its status maybe? item.iconPath = new ThemeIcon('git-commit'); item.description = ''; - item.detail = localize('git.timeline.detail', '{0} \u2014 {1}\n{2}\n\n{3}', you, localize('git.workingTree', 'Working Tree'), dateFormatter.format(date), Resource.getStatusText(working.type)); + item.setItemDetails(you, undefined, dateFormatter.format(date), Resource.getStatusText(working.type)); const cmd = this.commands.resolveTimelineOpenDiffCommand(item, uri); if (cmd) { From 6837589569e7d2dc6ad4de991ed2df6e422144ae Mon Sep 17 00:00:00 2001 From: Logan Ramos Date: Mon, 14 Mar 2022 14:55:00 -0400 Subject: [PATCH 14/14] Remove TabKind.other --- src/vs/workbench/api/browser/mainThreadEditorTabs.ts | 1 - src/vs/workbench/api/common/extHost.protocol.ts | 3 +-- src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts | 2 +- src/vscode-dts/vscode.proposed.tabs.d.ts | 3 +-- 4 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/api/browser/mainThreadEditorTabs.ts b/src/vs/workbench/api/browser/mainThreadEditorTabs.ts index c6d956194f3..3b4fef9a358 100644 --- a/src/vs/workbench/api/browser/mainThreadEditorTabs.ts +++ b/src/vs/workbench/api/browser/mainThreadEditorTabs.ts @@ -47,7 +47,6 @@ export class MainThreadEditorTabs { * @returns A tab object */ private _buildTabObject(group: IEditorGroup, editor: EditorInput, editorIndex: number): IEditorTabDto { - // Even though the id isn't a diff / sideBySide on the main side we need to let the ext host know what type of editor it is const editorId = editor.editorId; const tabKind = editor instanceof DiffEditorInput ? TabKind.Diff : editor instanceof SideBySideEditorInput ? TabKind.SidebySide : TabKind.Singular; const tab: IEditorTabDto = { diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 73db462b209..d4419a85614 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -628,8 +628,7 @@ export interface IEditorTabGroupDto { export enum TabKind { Singular = 0, Diff = 1, - SidebySide = 2, - Other = 3 + SidebySide = 2 } export interface IEditorTabDto { diff --git a/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts b/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts index 3a6be40a699..359ecb35c55 100644 --- a/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts +++ b/src/vs/workbench/api/test/browser/extHostEditorTabs.test.ts @@ -40,7 +40,7 @@ suite('ExtHostEditorTabs', function () { label: 'label1', viewColumn: 0, additionalResourcesAndViewTypes: [], - kind: TabKind.Other + kind: TabKind.Singular }; extHostEditorTabs.$acceptEditorTabModel([{ diff --git a/src/vscode-dts/vscode.proposed.tabs.d.ts b/src/vscode-dts/vscode.proposed.tabs.d.ts index 7cc8d4acbf8..1affd362f79 100644 --- a/src/vscode-dts/vscode.proposed.tabs.d.ts +++ b/src/vscode-dts/vscode.proposed.tabs.d.ts @@ -10,8 +10,7 @@ declare module 'vscode' { export enum TabKind { Singular = 0, Diff = 1, - SidebySide = 2, - Other = 3 + SidebySide = 2 } /**