jiebi/CodeConvo huggingface dataset:
Change:
Testing edit keybindings leave out args or have an empty array of commands trigger the command, nothing happens. This is expected but I wonder if an information/guiding message should be shown that the keybinding needs some commands to be useful?

Discussion:
import { Action2, registerAction2 } from 'vs/platform/actions/common/actions'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; <ins> import { ILogService } from 'vs/platform/log/common/log'; </ins> import { INotificationService } from 'vs/platform/notification/common/notification'; type RunnableCommand = string | { command: string; args: any[] };

} const commandService = accessor.get(ICommandService); <ins> const logService = accessor.get(ILogService); let i = 0; </ins> try { <del> for (const cmd of args.commands) { await this._runCommand(commandService, cmd); </del> <ins> for (; i < args.commands.length; ++i) { const cmd = args.commands[i]; logService.debug(`runCommands: executing ${i}-th command: ${JSON.stringify(cmd)}`); const r = await this._runCommand(commandService, cmd); logService.debug(`runCommands: executed ${i}-th command with return value: ${JSON.stringify(r)}`); </ins> } } catch (err) { <ins> logService.debug(`runCommands: executing ${i}-th command resulted in an error: ${err instanceof Error ? err.message : JSON.stringify(err)}`); </ins> notificationService.error(err); } }
Change:
Testing I suspect results are not in right order <img width="1198" alt="image" src="https://user-"Output result is shown first

Discussion:
export function compareNotebookPos(match1: NotebookMatch, match2: NotebookMatch): number { if (match1.cellIndex === match2.cellIndex) { <del> if (match1.matchStartIndex === match2.matchStartIndex) { if (match1.matchEndIndex === match2.matchEndIndex) { return 0; } else if (match1.matchEndIndex < match2.matchEndIndex) { </del> <ins> if (match1.webviewIndex !== undefined && match2.webviewIndex !== undefined) { return match1.webviewIndex - match2.webviewIndex; } else if (match1.webviewIndex === undefined && match2.webviewIndex === undefined) { if (match1.matchStartIndex === match2.matchStartIndex) { return match1.matchEndIndex - match2.matchEndIndex; } else if (match1.matchStartIndex < match2.matchStartIndex) { </ins> return -1; } else { return 1; } <del> } else if (match1.matchStartIndex < match2.matchStartIndex) { return -1; </del> } else { <del> return 1; </del> <ins> // webview matches should always be after content matches if (match1.webviewIndex !== undefined) { return 1; } else { return -1; } </ins> } } else if (match1.cellIndex < match2.cellIndex) { return -1;
Change:
Testing https://user-
I think this should rather generate tags instead of the relative link syntax for mp4 files?
Verified. Can't play the video in the preview, but not sure I should be able to. https://user-
It may be because you're in an untitled file, so we can't actually resolve that video path (since it is a relative path). Could you please try again having saved the text file to disk?
oh indeed works like magic <img width="1233" alt="image" src="https://user-"

Discussion:
'webp', ]); <ins> const videoFileExtensions = new Set<string>([ 'ogg', 'mp4' ]); </ins> export function registerDropIntoEditorSupport(selector: vscode.DocumentSelector) { return vscode.languages.registerDocumentDropEditProvider(selector, new class implements vscode.DocumentDropEditProvider { async provideDocumentDropEdits(document: vscode.TextDocument, _position: vscode.Position, dataTransfer: vscode.DataTransfer, token: vscode.CancellationToken): Promise<vscode.DocumentDropEdit | undefined> {

const ext = URI.Utils.extname(uri).toLowerCase().replace('.', ''); const insertAsImage = typeof options?.insertAsImage === 'undefined' ? imageFileExtensions.has(ext) : !!options.insertAsImage; <ins> const insertAsVideo = videoFileExtensions.has(ext); </ins> <del> snippet.appendText(insertAsImage ? '![' : '['); </del> <ins> if (insertAsVideo) { snippet.appendText(`<video src="${mdPath}" controls title="`); snippet.appendPlaceholder('Title'); snippet.appendText('"></video>'); } else { snippet.appendText(insertAsImage ? '![' : '['); </ins> <del> const placeholderText = options?.placeholderText ?? (insertAsImage ? 'Alt text' : 'label'); const placeholderIndex = typeof options?.placeholderStartIndex !== 'undefined' ? options?.placeholderStartIndex + i : undefined; snippet.appendPlaceholder(placeholderText, placeholderIndex); </del> <ins> const placeholderText = options?.placeholderText ?? (insertAsImage ? 'Alt text' : 'label'); const placeholderIndex = typeof options?.placeholderStartIndex !== 'undefined' ? options?.placeholderStartIndex + i : undefined; snippet.appendPlaceholder(placeholderText, placeholderIndex); </ins> <del> snippet.appendText(`](${mdPath})`); </del> <ins> snippet.appendText(`](${mdPath})`); } </ins> if (i < uris.length - 1 && uris.length > 1) { snippet.appendText(options?.separator ?? ' ');
Change:
! should be highlighted: ! Version: 1.77.0-insider (user setup) Commit: Date: 2023-03-21T05:22:13.879Z Electron: 19.1.11 Chromium: 102.0.5005.196 16.14.2 V8: 10.2.154.26-electron.0 OS: Windows_NT x64 10.0. Sandboxed: Yes
cc for TS
I cannot reproduce, semantic occurrences seem to work fine for me. can you reproduce running from source? !
I can repro out of sources as well
Looks like a windows specific issue (slash vs backslash): ! ! (in TypeScriptDocumentHighlightProvider.provideDocumentHighlights)
Reverting fixes it.
Hm I don't think this was caused by . Instead I suspect the root cause was

Discussion:
return []; } <del> return response.body .filter(highlight => highlight.file === file) .map(convertDocumentHighlight) .flat(); </del> <ins> return response.body.flatMap(convertDocumentHighlight); </ins> } }
Change:
Testing This should explain that it's the threshold at which a scroll bar appears. It reads like it won't attempt to render beyond this value or something. <img width="279" alt="image" src="https://user-"
How about ?

Discussion:
tags: ['notebookLayout'] }, [NotebookSetting.textOutputLineLimit]: { <del> description: nls.localize('notebook.textOutputLineLimit', "Control how many lines of text in a text output is rendered."), </del> <ins> markdownDescription: nls.localize('notebook.textOutputLineLimit', "Controls how many lines of text are displayed in a text output. If {0} is enabled, this setting is used to determine the scroll height of the output.", '`#notebook.output.scrolling#`'), </ins> type: 'number', default: 30, tags: ['notebookLayout']
Change:
Testing This doesn't read well to me: <img width="643" alt="image" src="https://user-"Suggestion:
Similar improvements could be made to the other settings. The "" in particular: <img width="265" alt="image" src="https://user-"
Thanks for the feedback, the suggestion looks good.

Discussion:
default: 'fromEditor' }, [NotebookSetting.outputLineHeight]: { <del> markdownDescription: nls.localize('notebook.outputLineHeight', "Line height of the output text for notebook cells.n - When set to 0, editor line height is used.n - Values between 0 and 8 will be used as a multiplier with the font size.n - Values greater than or equal to 8 will be used as effective values."), </del> <ins> markdownDescription: nls.localize('notebook.outputLineHeight', "Line height of the output text within notebook cells.n - When set to 0, editor line height is used.n - Values between 0 and 8 will be used as a multiplier with the font size.n - Values greater than or equal to 8 will be used as effective values."), </ins> type: 'number', default: 0, tags: ['notebookLayout'] }, [NotebookSetting.outputFontSize]: { <del> markdownDescription: nls.localize('notebook.outputFontSize', "Font size for the output text for notebook cells. When set to 0, {0} is used.", '`#editor.fontSize#`'), </del> <ins> markdownDescription: nls.localize('notebook.outputFontSize', "Font size for the output text within notebook cells. When set to 0, {0} is used.", '`#editor.fontSize#`'), </ins> type: 'number', default: 0, tags: ['notebookLayout'] }, [NotebookSetting.outputFontFamily]: { <del> markdownDescription: nls.localize('notebook.outputFontFamily', "The font family for the output text for notebook cells. When set to empty, the {0} is used.", '`#editor.fontFamily#`'), </del> <ins> markdownDescription: nls.localize('notebook.outputFontFamily', "The font family of the output text within notebook cells. When set to empty, the {0} is used.", '`#editor.fontFamily#`'), </ins> type: 'string', tags: ['notebookLayout'] },
Change:
Testing a OSS build without the marketplace in the welcome screen bug ! I see an empty quick pick

Discussion:
@IContextKeyService private readonly contextKeyService: IContextKeyService) { super(); <del> registerConfiguration(this.productService.quality !== 'stable'); </del> <ins> const enable = this.extensionGalleryService.isEnabled() && (this.productService.remoteExtensionTips ?? false) && this.productService.quality !== 'stable'; registerConfiguration(enable); </ins> const remoteExtensionTips = { ...this.productService.remoteExtensionTips, ...this.productService.virtualWorkspaceExtensionTips }; this.remoteExtensionMetadata = Object.values(remoteExtensionTips).filter(value => value.showInStartEntry === true).map(value => { return { id: value.extensionId, installed: false, friendlyName: value.friendlyName, remoteCommands: [], isPlatformCompatible: false, dependencies: [] };

const selectedItems = quickPick.selectedItems; if (selectedItems.length === 1) { const selectedItem = selectedItems[0].id!; <del> quickPick.busy = true; </del> const remoteExtension = this.remoteExtensionMetadata.find(value => ExtensionIdentifier.equals(value.id, selectedItem)); if (remoteExtension) { <ins> quickPick.items = []; quickPick.busy = true; </ins> quickPick.placeholder = nls.localize('remote.startActions.installingExtension', 'Installing extension... '); const galleryExtension = (await this.extensionGalleryService.getExtensions([{ id: selectedItem }], CancellationToken.None))[0];

this.commandService.executeCommand(command); this.telemetryService.publicLog2<RemoteStartActionEvent, RemoteStartActionClassification>('remoteStartList.ActionExecuted', { command: command, remoteExtensionId: selectedItem }); <del> quickPick.busy = false; </del> } else { this.commandService.executeCommand(selectedItem); this.telemetryService.publicLog2<RemoteStartActionEvent, RemoteStartActionClassification>('remoteStartList.ActionExecuted', { command: selectedItem }); } <ins> quickPick.dispose(); </ins> } }); <ins> quickPick.onDidHide(() => quickPick.dispose()); </ins> quickPick.show(); } }
Change:
Testing to... ! to Tunnel... a Tunnel window reloads the window is connecting to that chosen tunnel, click ! the window connects to the tunnel, click again ! (same as last pic) This is different than if I didn't take Step 4. Observe: to... ! to Tunnel... a Tunnel window reloads the window connects to the tunnel, click ! I think I would expect the 2nd and 3rd images to be this ^ as well.

Discussion:
@IContextKeyService private readonly contextKeyService: IContextKeyService) { super(); <del> registerConfiguration(this.productService.quality !== 'stable'); </del> <ins> const enable = this.extensionGalleryService.isEnabled() && (this.productService.remoteExtensionTips ?? false) && this.productService.quality !== 'stable'; registerConfiguration(enable); </ins> const remoteExtensionTips = { ...this.productService.remoteExtensionTips, ...this.productService.virtualWorkspaceExtensionTips }; this.remoteExtensionMetadata = Object.values(remoteExtensionTips).filter(value => value.showInStartEntry === true).map(value => { return { id: value.extensionId, installed: false, friendlyName: value.friendlyName, remoteCommands: [], isPlatformCompatible: false, dependencies: [] };

const selectedItems = quickPick.selectedItems; if (selectedItems.length === 1) { const selectedItem = selectedItems[0].id!; <del> quickPick.busy = true; </del> const remoteExtension = this.remoteExtensionMetadata.find(value => ExtensionIdentifier.equals(value.id, selectedItem)); if (remoteExtension) { <ins> quickPick.items = []; quickPick.busy = true; </ins> quickPick.placeholder = nls.localize('remote.startActions.installingExtension', 'Installing extension... '); const galleryExtension = (await this.extensionGalleryService.getExtensions([{ id: selectedItem }], CancellationToken.None))[0];

this.commandService.executeCommand(command); this.telemetryService.publicLog2<RemoteStartActionEvent, RemoteStartActionClassification>('remoteStartList.ActionExecuted', { command: command, remoteExtensionId: selectedItem }); <del> quickPick.busy = false; </del> } else { this.commandService.executeCommand(selectedItem); this.telemetryService.publicLog2<RemoteStartActionEvent, RemoteStartActionClassification>('remoteStartList.ActionExecuted', { command: selectedItem }); } <ins> quickPick.dispose(); </ins> } }); <ins> quickPick.onDidHide(() => quickPick.dispose()); </ins> quickPick.show(); } }
Change:
Testing Not sure if actually caused by welcome page bug In dev tools, see:
I can't repro this on my mac. Please feel free to reopen this issue if you see this again on your machine.
Yes I still see this every time I open the welcome page. Maybe it's because of an extension I have installed that is getting parsed oddly or an experiment? The exception is thrown here:

Discussion:
await this._init(); <del> let treatments = this.treatment?.extensions.filter(extension => !this.ignoredExtensions.has(extension)) ?? new Array<string>(); </del> <ins> let treatments = this.treatment?.extensions?.filter(extension => !this.ignoredExtensions.has(extension)) ?? new Array<string>(); </ins> const featuredExtensions: IFeaturedExtension[] = new Array(); if (this.treatment?.showAsList !== 'true' && treatments.length > 0) {

new Promise<string | undefined>(resolve => setTimeout(() => resolve(''), 2000)) ]); <del> this.treatment = extensions ? JSON.parse(extensions) : { extensions: [] }; </del> <ins> try { this.treatment = extensions ? JSON.parse(extensions) : { extensions: [] }; } catch { } </ins> this.title = extensionListTitle ?? localize('gettingStarted.featuredTitle', 'Featured'); <del> if (this.treatment) { </del> <ins> if (this.treatment?.extensions && Array.isArray(this.treatment.extensions)) { </ins> const installed = await this.extensionManagementService.getInstalled(); <del> for (const extension of Object.values(this.treatment.extensions)) { </del> <ins> for (const extension of this.treatment.extensions) { </ins> if (installed.some(e => ExtensionIdentifier.equals(e.identifier.id, extension))) { this.ignoredExtensions.add(extension); }
Change:
Testing After you click on e.g. Remote Repositories and you don't have the extension installed, the picker is still displayed with the options while the installation is in progress. Because the options there aren't very responsive during installation, maybe it's worth hiding them and only show the "installing" progress bar? !

Discussion:
@IContextKeyService private readonly contextKeyService: IContextKeyService) { super(); <del> registerConfiguration(this.productService.quality !== 'stable'); </del> <ins> const enable = this.extensionGalleryService.isEnabled() && (this.productService.remoteExtensionTips ?? false) && this.productService.quality !== 'stable'; registerConfiguration(enable); </ins> const remoteExtensionTips = { ...this.productService.remoteExtensionTips, ...this.productService.virtualWorkspaceExtensionTips }; this.remoteExtensionMetadata = Object.values(remoteExtensionTips).filter(value => value.showInStartEntry === true).map(value => { return { id: value.extensionId, installed: false, friendlyName: value.friendlyName, remoteCommands: [], isPlatformCompatible: false, dependencies: [] };

const selectedItems = quickPick.selectedItems; if (selectedItems.length === 1) { const selectedItem = selectedItems[0].id!; <del> quickPick.busy = true; </del> const remoteExtension = this.remoteExtensionMetadata.find(value => ExtensionIdentifier.equals(value.id, selectedItem)); if (remoteExtension) { <ins> quickPick.items = []; quickPick.busy = true; </ins> quickPick.placeholder = nls.localize('remote.startActions.installingExtension', 'Installing extension... '); const galleryExtension = (await this.extensionGalleryService.getExtensions([{ id: selectedItem }], CancellationToken.None))[0];

this.commandService.executeCommand(command); this.telemetryService.publicLog2<RemoteStartActionEvent, RemoteStartActionClassification>('remoteStartList.ActionExecuted', { command: command, remoteExtensionId: selectedItem }); <del> quickPick.busy = false; </del> } else { this.commandService.executeCommand(selectedItem); this.telemetryService.publicLog2<RemoteStartActionEvent, RemoteStartActionClassification>('remoteStartList.ActionExecuted', { command: selectedItem }); } <ins> quickPick.dispose(); </ins> } }); <ins> quickPick.onDidHide(() => quickPick.dispose()); </ins> quickPick.show(); } }
Change:
Testing I think I am wrongly being asked to install extensions now, but when I do need to install an extension, it would be nice to show a progress bar somewhere while this runs <img width="642" alt="image" src="https://user-"Or if I am going to be waiting for a bit, you might run the progress in a modal dialog or non-modal notification instead of a quickpick
somewhat related: FWIW I did see a progression bar while the extension was installing on Windows

Discussion:
@IContextKeyService private readonly contextKeyService: IContextKeyService) { super(); <del> registerConfiguration(this.productService.quality !== 'stable'); </del> <ins> const enable = this.extensionGalleryService.isEnabled() && (this.productService.remoteExtensionTips ?? false) && this.productService.quality !== 'stable'; registerConfiguration(enable); </ins> const remoteExtensionTips = { ...this.productService.remoteExtensionTips, ...this.productService.virtualWorkspaceExtensionTips }; this.remoteExtensionMetadata = Object.values(remoteExtensionTips).filter(value => value.showInStartEntry === true).map(value => { return { id: value.extensionId, installed: false, friendlyName: value.friendlyName, remoteCommands: [], isPlatformCompatible: false, dependencies: [] };

const selectedItems = quickPick.selectedItems; if (selectedItems.length === 1) { const selectedItem = selectedItems[0].id!; <del> quickPick.busy = true; </del> const remoteExtension = this.remoteExtensionMetadata.find(value => ExtensionIdentifier.equals(value.id, selectedItem)); if (remoteExtension) { <ins> quickPick.items = []; quickPick.busy = true; </ins> quickPick.placeholder = nls.localize('remote.startActions.installingExtension', 'Installing extension... '); const galleryExtension = (await this.extensionGalleryService.getExtensions([{ id: selectedItem }], CancellationToken.None))[0];

this.commandService.executeCommand(command); this.telemetryService.publicLog2<RemoteStartActionEvent, RemoteStartActionClassification>('remoteStartList.ActionExecuted', { command: command, remoteExtensionId: selectedItem }); <del> quickPick.busy = false; </del> } else { this.commandService.executeCommand(selectedItem); this.telemetryService.publicLog2<RemoteStartActionEvent, RemoteStartActionClassification>('remoteStartList.ActionExecuted', { command: selectedItem }); } <ins> quickPick.dispose(); </ins> } }); <ins> quickPick.onDidHide(() => quickPick.dispose()); </ins> quickPick.show(); } }
Change:
a word on a line Markdown permalink from gutter :bug: editor selection updates to whole line This makes it impossible to generate a Markdown link with a specific word selection from right clicking on an editor line number.

Discussion:
// set the selection to the clicked line number if (e.target.type === MouseTargetType.GUTTER_LINE_NUMBERS) { const currentSelections = this.editor.getSelections(); <del> const containsSelection = currentSelections?.some(selection => selection.containsPosition({ lineNumber, column: 1 })); </del> <ins> const lineRange = { startLineNumber: lineNumber, endLineNumber: lineNumber, startColumn: 1, endColumn: model.getLineLength(lineNumber) + 1 }; const containsSelection = currentSelections?.some(selection => !selection.isEmpty() && selection.intersectRanges(lineRange) !== null); </ins> if (!containsSelection) { <del> const selection = { startLineNumber: lineNumber, endLineNumber: lineNumber, startColumn: 1, endColumn: model.getLineLength(lineNumber) + 1 }; this.editor.setSelection(selection, TextEditorSelectionSource.PROGRAMMATIC); </del> <ins> this.editor.setSelection(lineRange, TextEditorSelectionSource.PROGRAMMATIC); </ins> } }
Change:
<!-- Do Not Delete This! bugreporttemplate --<!-- Please read our Rules of Conduct: --<!-- Read our guide about submitting issues: --<!-- Search existing issues to avoid creating duplicates. --<!-- Test using the latest Insiders build to see if your issue has already been fixed: --<!-- Instead of creating your report here, use 'Report Issue' from the 'Help' menu in VS Code to pre-fill useful information. --<!-- Launch with to check. --Does this issue occur when all extensions are disabled?: Yes <!-- If you answered No above, use 'Help: Start Extension Bisect' from Command Palette to try to identify the cause. --<!-- Issues caused by an extension need to be reported directly to the extension publisher. The 'Help Report Issue' dialog can assist with this. --- VS Code Version: latest master OS Version: Windows 11 Home Browser: Firefox 111 Steps to Reproduce: Visual Studio for the web in Firefox at (this is mainly to get VS Code running in Firefox) Ctrl + K, Ctrl + S to open the keyboard shortcuts page. the button to start "Record keys". press "-" key on a US keyboard (2 keys left of Backspace key). that the keyboard shortcut shows "audiovolumemute". I expect "-" to show. press "=" key (1 key left of the Backspace key), see that "unknown" is shown. I expect "=" to show. If running steps 4 and 6 in MS Edge (Chrome the same), then the keys show properly.
Hi , Thanks for filing the issue. We'll have a look. For devs interested: the key troubleshooting (windows 11, macos ventura, ubuntu 22.04 - all same):- bingo! this actually happens only on windows: we convert the "keyCode" incorrectly (173 -112) for minus and (61 -0) for equal, but that doesn't affect mac & linux because they use , which is actually correct, instead of we assign

Discussion:
} else if (browser.isFirefox) { switch (keyCode) { case 59: return KeyCode.Semicolon; <ins> case 60: if (platform.isLinux) { return KeyCode.IntlBackslash; } break; case 61: return KeyCode.Equal; </ins> // based on: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode#numpad_keys case 107: return KeyCode.NumpadAdd; case 109: return KeyCode.NumpadSubtract; <ins> case 173: return KeyCode.Minus; </ins> case 224: if (platform.isMacintosh) { return KeyCode.Meta; } <ins> break; </ins> } } else if (browser.isWebKit) { if (platform.isMacintosh && keyCode === 93) {
Change:
enable sticky scroll select something in the editor select :bug: the selection isn't cleared enable keybindings debug mode (F1 Toggle Keyboard Shortcuts Troubleshooting) see that sticky scroll is consuming ESC

Discussion:
value: localize('selectEditor.title', "Select Editor"), original: 'Select Editor' }, <del> precondition: ContextKeyExpr.has('config.editor.stickyScroll.enabled'), </del> <ins> precondition: EditorContextKeys.stickyScrollFocused.isEqualTo(true), </ins> keybinding: { weight, primary: KeyCode.Escape