if (args.verbose) { fancyLog(`${ansiColors.magenta('BuiltIn extensions')}: ${dedupedBuiltInExtensions.map(e => path.basename(e.extensionPath)).join(', ')}`); <del> fancyLog(`${ansiColors.magenta('Additional extensions')}: ${additionalBuiltinExtensions.map(e => path.basename(e.extensionLocation.path)).join(', ') || 'None'}`); </del> <ins> fancyLog(`${ansiColors.magenta('Additional extensions')}: ${additionalBuiltinExtensions.map(e => path.basename(e.path)).join(', ') || 'None'}`); </ins> } const secondaryHost = (


import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { XtermLinkMatcherHandler } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; import { TerminalBaseLinkProvider } from 'vs/workbench/contrib/terminal/browser/links/terminalBaseLinkProvider'; <del> import { normalize } from 'vs/base/common/path'; </del> <ins> import { normalize, isAbsolute } from 'vs/base/common/path'; </ins> import { convertLinkRangeToBuffer, getXtermLineContent } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkHelpers'; import { isWindows } from 'vs/base/common/platform'; <ins> import { IFileService } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; </ins> const MAX_LENGTH = 2000;


@IQuickInputService private readonly _quickInputService: IQuickInputService, @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, @ISearchService private readonly _searchService: ISearchService, <del> @IEditorService private readonly _editorService: IEditorService </del> <ins> @IEditorService private readonly _editorService: IEditorService, @IFileService private readonly _fileService: IFileService, @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService </ins> ) { super(); }


} private async _activate(link: string) { <del> // Normalize the link and remove any leading ./ or ../ since quick access doesn't understand // that format </del> <ins> // Remove file:/// and any leading ./ or ../ since quick access doesn't understand that format link = link.replace(/^file:///?/, ''); </ins> link = normalize(link).replace(/^(.+[/])+/, ''); // Remove `:in` from the end which is how Ruby outputs stack traces


}); const sanitizedLink = link.replace(/:d+(:d+)?$/, ''); <del> const results = await this._searchService.fileSearch( this._fileQueryBuilder.file(this._workspaceContextService.getWorkspace().folders, { // Remove optional :row:col from the link as openEditor supports it filePattern: sanitizedLink, maxResults: 2 }) ); // If there was exactly one match, open it if (results.results.length === 1) { </del> <ins> let exactMatch = await this._getExactMatch(sanitizedLink, link); if (exactMatch) { // If there was exactly one match, open it </ins> const match = link.match(/:(d+)?(:(d+))?$/); const startLineNumber = match?.[1]; const startColumn = match?.[3]; await this._editorService.openEditor({ <del> resource: results.results[0].resource, </del> <ins> resource: exactMatch, </ins> options: { pinned: true, revealIfOpened: true,


}); return; } // Fallback to searching quick access <del> this._quickInputService.quickAccess.show(link); </del> <ins> return this._quickInputService.quickAccess.show(link); } private async _getExactMatch(sanitizedLink: string, link: string): Promise<URI | undefined> { let exactResource: URI | undefined; if (isAbsolute(sanitizedLink)) { const scheme = this._environmentService.remoteAuthority ? Schemas.vscodeRemote : Schemas.file; const resource = URI.from({ scheme, path: sanitizedLink }); const fileStat = await this._fileService.resolve(resource); if (fileStat.isFile) { exactResource = resource; } } if (!exactResource) { const results = await this._searchService.fileSearch( this._fileQueryBuilder.file(this._workspaceContextService.getWorkspace().folders, { // Remove optional :row:col from the link as openEditor supports it filePattern: sanitizedLink, maxResults: 2 }) ); if (results.results.length === 1) { exactResource = results.results[0].resource; } } return exactResource; </ins> } }


await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); await assertLink('', []); }); <ins> test('should support file scheme links', async () => { await configurationService.setUserConfiguration('terminal', { integrated: { wordSeparators: ' ' } }); await assertLink('file:///C:/users/test/file.txt ', [{ range: [[1, 1], [30, 1]], text: 'file:///C:/users/test/file.txt' }]); await assertLink('file:///C:/users/test/file.txt:1:10 ', [{ range: [[1, 1], [35, 1]], text: 'file:///C:/users/test/file.txt:1:10' }]); }); </ins> });


} if (e.element instanceof InstructionBreakpoint) { const disassemblyView = await this.editorService.openEditor(DisassemblyViewInput.instance); <del> (disassemblyView as DisassemblyView).goToAddress(e.element.instructionReference); </del> <ins> // Focus on double click (disassemblyView as DisassemblyView).goToAddress(e.element.instructionReference, e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2); </ins> } if (e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2 && e.element instanceof FunctionBreakpoint && e.element !== this.inputBoxData?.breakpoint) { // double click


multipleSelectionSupport: false, setRowLineHeight: false, openOnSingleClick: false, <del> accessibilityProvider: new AccessibilityProvider() </del> <ins> accessibilityProvider: new AccessibilityProvider(), mouseSupport: false </ins> } )) as WorkbenchTable<IDisassembledInstructionEntry>;


/** * Go to the address provided. If no address is provided, reveal the address of the currently focused stack frame. */ <del> goToAddress(address?: string): void { </del> <ins> goToAddress(address?: string, focus?: boolean): void { </ins> if (!this._disassembledInstructions) { return; }


const bottomElement = Math.floor((this._disassembledInstructions.scrollTop + this._disassembledInstructions.renderHeight) / this.fontInfo.lineHeight); if (index > topElement && index < bottomElement) { // Inside the viewport, don't do anything here <del> return; </del> } else if (index <= topElement && index > topElement - 5) { // Not too far from top, review it at the top <del> return this._disassembledInstructions.reveal(index, 0); </del> <ins> this._disassembledInstructions.reveal(index, 0); </ins> } else if (index >= bottomElement && index < bottomElement + 5) { // Not too far from bottom, review it at the bottom <del> return this._disassembledInstructions.reveal(index, 1); </del> <ins> this._disassembledInstructions.reveal(index, 1); </ins> } else { // Far from the current viewport, reveal it <del> return this._disassembledInstructions.reveal(index, 0.5); </del> <ins> this._disassembledInstructions.reveal(index, 0.5); } if (focus) { this._disassembledInstructions.domFocus(); this._disassembledInstructions.setFocus([index]); </ins> } } else if (this._debugService.state === State.Stopped) { // Address is not provided or not in the table currently, clear the table // and reload if we are in the state where we can load disassembly. <del> return this.reloadDisassembly(address); </del> <ins> this.reloadDisassembly(address); </ins> } }


this.loadDisassembledInstructions(targetAddress, -DisassemblyView.NUM_INSTRUCTIONS_TO_LOAD, DisassemblyView.NUM_INSTRUCTIONS_TO_LOAD * 2).then(() => { // on load, set the target instruction in the middle of the page. if (this._disassembledInstructions!.length > 0) { <del> this._disassembledInstructions!.reveal(Math.floor(this._disassembledInstructions!.length / 2), 0.5); </del> <ins> const targetIndex = Math.floor(this._disassembledInstructions!.length / 2); this._disassembledInstructions!.reveal(targetIndex, 0.5); // Always focus the target address on reload, or arrow key navigation would look terrible this._disassembledInstructions!.domFocus(); this._disassembledInstructions!.setFocus([targetIndex]); </ins> } }); }


// Without formatting we still need to support the separator // as provided in options (https://github.com/microsoft/vscode/issues/130019) if (!formatting && options.separator) { <del> switch (options.separator) { case paths.win32.sep: return paths.win32.normalize(label); case paths.posix.sep: return paths.posix.normalize(label); } </del> <ins> return label.replace(sepRegexp, options.separator); </ins> } return label;


assert.strictEqual(generated, label); }); }); <ins> test('relative label with explicit path separator', () => { let generated = labelService.getUriLabel(URI.parse('myscheme://myauthority/some/folder/test.txt'), { relative: true, separator: '/' }); assert.strictEqual(generated, 'some/folder/test.txt'); generated = labelService.getUriLabel(URI.parse('myscheme://myauthority/some/folder/test.txt'), { relative: true, separator: '' }); assert.strictEqual(generated, 'somefoldertest.txt'); }); </ins> });


} .monaco-editor .find-widget .button { <del> width: 20px; height: 20px; </del> <ins> width: 16px; height: 16px; padding: 3px; border-radius: 5px; </ins> display: flex; flex: initial; margin-left: 3px;


justify-content: center; } <ins> /* find in selection button */ .monaco-editor .find-widget .codicon-find-selection { width: 22px; height: 22px; padding: 3px; border-radius: 5px; } </ins> .monaco-editor .find-widget .button.left { margin-left: 0; margin-right: 3px;


import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/findState'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; <del> import { contrastBorder, editorFindMatch, editorFindMatchBorder, editorFindMatchHighlight, editorFindMatchHighlightBorder, editorFindRangeHighlight, editorFindRangeHighlightBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetResizeBorder, errorForeground, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground, focusBorder } from 'vs/platform/theme/common/colorRegistry'; </del> <ins> import { contrastBorder, editorFindMatch, editorFindMatchBorder, editorFindMatchHighlight, editorFindMatchHighlightBorder, editorFindRangeHighlight, editorFindRangeHighlightBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetResizeBorder, errorForeground, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground, focusBorder, toolbarHoverBackground } from 'vs/platform/theme/common/colorRegistry'; </ins> import { IColorTheme, IThemeService, registerThemingParticipant, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { ContextScopedFindInput, ContextScopedReplaceInput } from 'vs/platform/browser/contextScopedHistoryWidget'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility';


} } <ins> // Action bars const toolbarHoverBackgroundColor = theme.getColor(toolbarHoverBackground); if (toolbarHoverBackgroundColor) { collector.addRule(` .monaco-editor .find-widget .button:not(.disabled):hover, .monaco-editor .find-widget .codicon-find-selection:hover { background-color: ${toolbarHoverBackgroundColor} !important; } `); } </ins> // This rule is used to override the outline color for synthetic-focus find input. const focusOutline = theme.getColor(focusBorder); if (focusOutline) {


const media = stepToExpand.media; const mediaElement = $<HTMLImageElement>('img'); <ins> clearNode(this.stepMediaComponent); </ins> this.stepMediaComponent.appendChild(mediaElement); mediaElement.setAttribute('alt', media.altText); this.updateMediaSourceForColorMode(mediaElement, media.path);


this.container.classList.toggle('height-constrained', size.height <= 600); this.container.classList.toggle('width-constrained', size.width <= 400); this.container.classList.toggle('width-semi-constrained', size.width <= 800); <ins> this.categoriesPageScrollbar?.scanDomNode(); this.detailsPageScrollbar?.scanDomNode(); this.detailsScrollbar?.scanDomNode(); </ins> } private updateCategoryProgress() {


<del> <svg viewBox="0 0 520 238" fill="none" xmlns="http://www.w3.org/2000/svg"> <g> <rect width="520" height="238" fill="var(--vscode-breadcrumb-background, #1E1E1E)" /> <g clip-path="url(#clip0_1_138)"> <g> <rect width="520" height="39" fill="var(--vscode-breadcrumbPicker-background, #252526)" /> <g clip-path="url(#clip1_1_138)"> <g> <rect width="115.654" height="39.2998" fill="var(--vscode-breadcrumb-background, #1E1E1E)" /> <rect x="13.4742" y="15.7199" width="88.7052" height="7.85995" rx="3.92998" fill="var(--vscode-tab-inactiveBackground, #2D2D2D)" /> </g> </g> <path d="M215.244 20.2222C212.699 20.2222 211.112 18.3813 211.112 15.4233C211.112 12.459 212.692 10.6182 215.238 10.6182C217.256 10.6182 218.818 11.9067 219.046 13.7412H217.631C217.364 12.605 216.444 11.8813 215.238 11.8813C213.594 11.8813 212.565 13.2461 212.565 15.4233C212.565 17.6006 213.594 18.959 215.244 18.959C216.457 18.959 217.377 18.3052 217.631 17.2642H219.046C218.792 19.0479 217.288 20.2222 215.244 20.2222ZM220.76 20V13.1064H222.074V14.1538H222.176C222.373 13.4746 223.141 12.9858 224.042 12.9858C224.245 12.9858 224.505 13.0049 224.651 13.0366V14.3188C224.537 14.2871 224.131 14.2427 223.89 14.2427C222.855 14.2427 222.125 14.9092 222.125 15.8804V20H220.76ZM230.32 18.1528H231.634C231.335 19.3716 230.218 20.1333 228.638 20.1333C226.657 20.1333 225.445 18.7686 225.445 16.5659C225.445 14.376 226.683 12.9731 228.631 12.9731C230.555 12.9731 231.716 14.2871 231.716 16.4453V16.915H226.835V16.9785C226.879 18.229 227.584 19.0161 228.676 19.0161C229.501 19.0161 230.066 18.7114 230.32 18.1528ZM228.625 14.084C227.616 14.084 226.911 14.8203 226.835 15.9312H230.326C230.294 14.814 229.634 14.084 228.625 14.084ZM235.265 20.1143C233.932 20.1143 232.96 19.3145 232.96 18.0576C232.96 16.8198 233.887 16.1025 235.531 16.001L237.404 15.8867V15.2837C237.404 14.5283 236.921 14.103 235.988 14.103C235.227 14.103 234.7 14.3887 234.547 14.8901H233.227C233.367 13.7285 234.484 12.9731 236.052 12.9731C237.785 12.9731 238.762 13.8364 238.762 15.2837V20H237.448V19.0225H237.34C236.928 19.7207 236.172 20.1143 235.265 20.1143ZM235.614 19.0161C236.642 19.0161 237.404 18.3433 237.404 17.4546V16.8579L235.715 16.9722C234.763 17.0356 234.332 17.3721 234.332 18.0005C234.332 18.6416 234.871 19.0161 235.614 19.0161ZM241.187 11.3672H242.552V13.1255H244.05V14.2173H242.552V17.8545C242.552 18.5972 242.85 18.9209 243.529 18.9209C243.739 18.9209 243.859 18.9082 244.05 18.8892V19.9746C243.828 20.0127 243.574 20.0444 243.307 20.0444C241.79 20.0444 241.187 19.5112 241.187 18.1846V14.2173H240.089V13.1255H241.187V11.3672ZM250.112 18.1528H251.426C251.127 19.3716 250.01 20.1333 248.43 20.1333C246.449 20.1333 245.237 18.7686 245.237 16.5659C245.237 14.376 246.475 12.9731 248.423 12.9731C250.347 12.9731 251.508 14.2871 251.508 16.4453V16.915H246.627V16.9785C246.671 18.229 247.376 19.0161 248.468 19.0161C249.293 19.0161 249.858 18.7114 250.112 18.1528ZM248.417 14.084C247.408 14.084 246.703 14.8203 246.627 15.9312H250.118C250.086 14.814 249.426 14.084 248.417 14.084ZM256.859 10.8403H260.446C262.236 10.8403 263.467 12.0718 263.467 13.8745C263.467 15.6392 262.198 16.8706 260.401 16.8706H258.281V20H256.859V10.8403ZM258.281 12.04V15.6772H260.071C261.296 15.6772 262.014 15.0234 262.014 13.8745C262.014 12.6875 261.322 12.04 260.071 12.04H258.281ZM265.143 20V13.1064H266.457V14.1538H266.559C266.755 13.4746 267.523 12.9858 268.425 12.9858C268.628 12.9858 268.888 13.0049 269.034 13.0366V14.3188C268.92 14.2871 268.514 14.2427 268.272 14.2427C267.238 14.2427 266.508 14.9092 266.508 15.8804V20H265.143ZM273.09 20.1333C271.065 20.1333 269.828 18.7812 269.828 16.5532C269.828 14.3315 271.072 12.9731 273.09 12.9731C275.103 12.9731 276.347 14.3252 276.347 16.5532C276.347 18.7812 275.109 20.1333 273.09 20.1333ZM273.09 18.9717C274.271 18.9717 274.944 18.083 274.944 16.5532C274.944 15.0171 274.271 14.1284 273.09 14.1284C271.903 14.1284 271.237 15.0171 271.237 16.5532C271.237 18.0894 271.903 18.9717 273.09 18.9717ZM278.479 20V14.2173H277.343V13.1255H278.479V12.3828C278.479 11.0117 279.178 10.3389 280.612 10.3389C280.923 10.3389 281.19 10.3643 281.425 10.4023V11.4307C281.298 11.4116 281.114 11.3989 280.898 11.3989C280.136 11.3989 279.825 11.748 279.825 12.4463V13.1255H281.368V14.2173H279.844V20H278.479ZM283.621 11.875C283.145 11.875 282.758 11.4878 282.758 11.0181C282.758 10.542 283.145 10.1548 283.621 10.1548C284.097 10.1548 284.484 10.542 284.484 11.0181C284.484 11.4878 284.097 11.875 283.621 11.875ZM282.942 20V13.1064H284.3V20H282.942ZM286.37 20V10.4023H287.734V20H286.37ZM294.317 18.1528H295.631C295.333 19.3716 294.215 20.1333 292.635 20.1333C290.654 20.1333 289.442 18.7686 289.442 16.5659C289.442 14.376 290.68 12.9731 292.628 12.9731C294.552 12.9731 295.713 14.2871 295.713 16.4453V16.915H290.832V16.9785C290.876 18.229 291.581 19.0161 292.673 19.0161C293.498 19.0161 294.063 18.7114 294.317 18.1528ZM292.622 14.084C291.613 14.084 290.908 14.8203 290.832 15.9312H294.323C294.292 14.814 293.631 14.084 292.622 14.084ZM298.411 20.0952C297.878 20.0952 297.478 19.6953 297.478 19.1812C297.478 18.667 297.878 18.2671 298.411 18.2671C298.951 18.2671 299.344 18.667 299.344 19.1812C299.344 19.6953 298.951 20.0952 298.411 20.0952ZM302.512 20.0952C301.979 20.0952 301.579 19.6953 301.579 19.1812C301.579 18.667 301.979 18.2671 302.512 18.2671C303.051 18.2671 303.445 18.667 303.445 19.1812C303.445 19.6953 303.051 20.0952 302.512 20.0952ZM306.612 20.0952C306.079 20.0952 305.679 19.6953 305.679 19.1812C305.679 18.667 306.079 18.2671 306.612 18.2671C307.152 18.2671 307.545 18.667 307.545 19.1812C307.545 19.6953 307.152 20.0952 306.612 20.0952Z" fill="var(--vscode-quickInput-foreground, #FFFFFF)" /> </g> </g> <g filter="url(#filter0_d_1_138)"> <rect width="425" height="196" transform="translate(47 24)" fill="var(--vscode-breadcrumbPicker-background, #252526)" /> <g> <g> <rect x="54.5" y="31.5" width="410" height="25" fill="var(--vscode-checkbox-background, #3C3C3C)" /> <rect x="54.5" y="31.5" width="410" height="25" stroke="var(--vscode-focusBorder, #007FD4)" /> </g> </g> <g> <g> <rect width="425" height="24" transform="translate(47 64)" fill="var(--vscode-peekViewEditor-background, #062F4A)" /> <path d="M65.9634 79.7749V81H60.1489V71.8403H65.9634V73.0654H61.5708V75.7441H65.7285V76.9248H61.5708V79.7749H65.9634ZM67.8613 81V74.1064H69.1753V75.2046H69.2769C69.5815 74.4302 70.2798 73.9731 71.2002 73.9731C72.146 73.9731 72.7998 74.4619 73.1045 75.2046H73.2124C73.5615 74.4619 74.355 73.9731 75.3135 73.9731C76.71 73.9731 77.5225 74.811 77.5225 76.2456V81H76.1577V76.5757C76.1577 75.6235 75.7134 75.1602 74.8184 75.1602C73.936 75.1602 73.3584 75.8076 73.3584 76.6392V81H72.019V76.436C72.019 75.6489 71.4985 75.1602 70.686 75.1602C69.8545 75.1602 69.2261 75.8647 69.2261 76.7661V81H67.8613ZM83.0259 73.9858C84.7842 73.9858 85.895 75.3633 85.895 77.5532C85.895 79.7305 84.7842 81.1143 83.0386 81.1143C82.0547 81.1143 81.2739 80.689 80.9121 79.959H80.8042V83.2979H79.4395V74.1064H80.7534V75.249H80.855C81.2739 74.4619 82.0864 73.9858 83.0259 73.9858ZM82.6387 79.9463C83.8003 79.9463 84.4922 79.0513 84.4922 77.5532C84.4922 76.0552 83.8003 75.1538 82.645 75.1538C81.4961 75.1538 80.7788 76.0742 80.7788 77.5532C80.7788 79.0259 81.4961 79.9463 82.6387 79.9463ZM88.0215 72.3672H89.3862V74.1255H90.8843V75.2173H89.3862V78.8545C89.3862 79.5972 89.6846 79.9209 90.3638 79.9209C90.5732 79.9209 90.6938 79.9082 90.8843 79.8892V80.9746C90.6621 81.0127 90.4082 81.0444 90.1416 81.0444C88.6245 81.0444 88.0215 80.5112 88.0215 79.1846V75.2173H86.9233V74.1255H88.0215V72.3672ZM93.1758 83.501C93.0615 83.501 92.7378 83.4883 92.6108 83.4692V82.3521C92.7188 82.3711 92.9282 82.3774 93.0552 82.3774C93.7026 82.3774 94.0708 82.1045 94.3057 81.3745L94.4072 81.019L91.9062 74.1064H93.3916L95.1245 79.6289H95.2324L96.959 74.1064H98.4062L95.8291 81.3174C95.2388 82.9741 94.585 83.501 93.1758 83.501ZM103.516 71.8403H107.103C108.893 71.8403 110.124 73.0718 110.124 74.8745C110.124 76.6392 108.854 77.8706 107.058 77.8706H104.938V81H103.516V71.8403ZM104.938 73.04V76.6772H106.728C107.953 76.6772 108.67 76.0234 108.67 74.8745C108.67 73.6875 107.979 73.04 106.728 73.04H104.938ZM111.8 81V74.1064H113.114V75.1538H113.215C113.412 74.4746 114.18 73.9858 115.082 73.9858C115.285 73.9858 115.545 74.0049 115.691 74.0366V75.3188C115.577 75.2871 115.17 75.2427 114.929 75.2427C113.895 75.2427 113.165 75.9092 113.165 76.8804V81H111.8ZM119.747 81.1333C117.722 81.1333 116.484 79.7812 116.484 77.5532C116.484 75.3315 117.729 73.9731 119.747 73.9731C121.759 73.9731 123.003 75.3252 123.003 77.5532C123.003 79.7812 121.766 81.1333 119.747 81.1333ZM119.747 79.9717C120.928 79.9717 121.601 79.083 121.601 77.5532C121.601 76.0171 120.928 75.1284 119.747 75.1284C118.56 75.1284 117.894 76.0171 117.894 77.5532C117.894 79.0894 118.56 79.9717 119.747 79.9717ZM125.136 81V75.2173H124V74.1255H125.136V73.3828C125.136 72.0117 125.834 71.3389 127.269 71.3389C127.58 71.3389 127.847 71.3643 128.082 71.4023V72.4307C127.955 72.4116 127.771 72.3989 127.555 72.3989C126.793 72.3989 126.482 72.748 126.482 73.4463V74.1255H128.024V75.2173H126.501V81H125.136ZM130.278 72.875C129.802 72.875 129.415 72.4878 129.415 72.0181C129.415 71.542 129.802 71.1548 130.278 71.1548C130.754 71.1548 131.141 71.542 131.141 72.0181C131.141 72.4878 130.754 72.875 130.278 72.875ZM129.599 81V74.1064H130.957V81H129.599ZM133.026 81V71.4023H134.391V81H133.026ZM140.974 79.1528H142.288C141.989 80.3716 140.872 81.1333 139.292 81.1333C137.311 81.1333 136.099 79.7686 136.099 77.5659C136.099 75.376 137.336 73.9731 139.285 73.9731C141.208 73.9731 142.37 75.2871 142.37 77.4453V77.915H137.489V77.9785C137.533 79.229 138.238 80.0161 139.33 80.0161C140.155 80.0161 140.72 79.7114 140.974 79.1528ZM139.279 75.084C138.27 75.084 137.565 75.8203 137.489 76.9312H140.98C140.948 75.814 140.288 75.084 139.279 75.084Z" fill="var(--vscode-quickInput-foreground, #FFFFFF)" /> </g> <g> <g> <rect x="59" y="98" width="62.5" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)" /> <rect x="125.5" y="98" width="29" height="6" rx="3" fill="var(--vscode-banner-iconForeground, #3794FF)" fill-opacity="0.6" /> <rect x="158.5" y="98" width="62.5" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)" /> </g> </g> <g> <path d="M60.1489 123.84H63.7354C65.5254 123.84 66.7568 125.072 66.7568 126.875C66.7568 128.639 65.4873 129.871 63.6909 129.871H61.5708V133H60.1489V123.84ZM61.5708 125.04V128.677H63.3608C64.5859 128.677 65.3032 128.023 65.3032 126.875C65.3032 125.688 64.6113 125.04 63.3608 125.04H61.5708ZM69.334 135.501C69.2197 135.501 68.896 135.488 68.769 135.469V134.352C68.877 134.371 69.0864 134.377 69.2134 134.377C69.8608 134.377 70.229 134.104 70.4639 133.375L70.5654 133.019L68.0645 126.106H69.5498L71.2827 131.629H71.3906L73.1172 126.106H74.5645L71.9873 133.317C71.397 134.974 70.7432 135.501 69.334 135.501ZM76.4434 124.367H77.8081V126.125H79.3062V127.217H77.8081V130.854C77.8081 131.597 78.1064 131.921 78.7856 131.921C78.9951 131.921 79.1157 131.908 79.3062 131.889V132.975C79.084 133.013 78.8301 133.044 78.5635 133.044C77.0464 133.044 76.4434 132.511 76.4434 131.185V127.217H75.3452V126.125H76.4434V124.367ZM80.9756 133V123.402H82.3276V127.205H82.4355C82.772 126.437 83.502 125.979 84.543 125.979C86.0156 125.979 86.9233 126.913 86.9233 128.544V133H85.5586V128.868C85.5586 127.731 85.0444 127.167 84.0796 127.167C82.9624 127.167 82.3403 127.884 82.3403 128.963V133H80.9756ZM91.7666 133.133C89.7417 133.133 88.5039 131.781 88.5039 129.553C88.5039 127.332 89.748 125.973 91.7666 125.973C93.7788 125.973 95.0229 127.325 95.0229 129.553C95.0229 131.781 93.7852 133.133 91.7666 133.133ZM91.7666 131.972C92.9473 131.972 93.6201 131.083 93.6201 129.553C93.6201 128.017 92.9473 127.128 91.7666 127.128C90.5796 127.128 89.9131 128.017 89.9131 129.553C89.9131 131.089 90.5796 131.972 91.7666 131.972ZM96.667 133V126.106H97.981V127.198H98.0825C98.4189 126.437 99.1045 125.973 100.146 125.973C101.688 125.973 102.539 126.894 102.539 128.538V133H101.174V128.861C101.174 127.719 100.691 127.16 99.6821 127.16C98.6729 127.16 98.0317 127.846 98.0317 128.957V133H96.667Z" fill="var(--vscode-quickInput-foreground, #FFFFFF)" /> <path d="M60.1489 149.84H63.4561C66.1729 149.84 67.7661 151.516 67.7661 154.398C67.7661 157.312 66.1855 159 63.4561 159H60.1489V149.84ZM61.5708 151.065V157.775H63.2974C65.2144 157.775 66.3188 156.55 66.3188 154.417C66.3188 152.303 65.1953 151.065 63.2974 151.065H61.5708ZM72.457 159.133C70.4321 159.133 69.1943 157.781 69.1943 155.553C69.1943 153.332 70.4385 151.973 72.457 151.973C74.4692 151.973 75.7134 153.325 75.7134 155.553C75.7134 157.781 74.4756 159.133 72.457 159.133ZM72.457 157.972C73.6377 157.972 74.3105 157.083 74.3105 155.553C74.3105 154.017 73.6377 153.128 72.457 153.128C71.27 153.128 70.6035 154.017 70.6035 155.553C70.6035 157.089 71.27 157.972 72.457 157.972ZM83.21 154.322H81.8833C81.7246 153.649 81.166 153.135 80.252 153.135C79.1094 153.135 78.4111 154.036 78.4111 155.528C78.4111 157.051 79.1157 157.972 80.252 157.972C81.1152 157.972 81.7056 157.565 81.8833 156.816H83.21C83.0322 158.175 81.9658 159.133 80.2583 159.133C78.2461 159.133 77.0146 157.762 77.0146 155.528C77.0146 153.338 78.2397 151.973 80.252 151.973C81.9849 151.973 83.0322 152.982 83.21 154.322ZM93.6772 152.151L91.7158 159H90.3701L87.9009 149.84H89.3799L91.062 156.962H91.1509L93.0615 149.84H94.3818L96.3052 156.962H96.394L98.0698 149.84H99.5488L97.0732 159H95.7339L93.7661 152.151H93.6772ZM100.704 159V152.106H102.018V153.154H102.12C102.316 152.475 103.084 151.986 103.986 151.986C104.189 151.986 104.449 152.005 104.595 152.037V153.319C104.481 153.287 104.075 153.243 103.833 153.243C102.799 153.243 102.069 153.909 102.069 154.88V159H100.704ZM106.614 150.875C106.138 150.875 105.75 150.488 105.75 150.018C105.75 149.542 106.138 149.155 106.614 149.155C107.09 149.155 107.477 149.542 107.477 150.018C107.477 150.488 107.09 150.875 106.614 150.875ZM105.935 159V152.106H107.293V159H105.935ZM109.781 150.367H111.146V152.125H112.644V153.217H111.146V156.854C111.146 157.597 111.444 157.921 112.124 157.921C112.333 157.921 112.454 157.908 112.644 157.889V158.975C112.422 159.013 112.168 159.044 111.901 159.044C110.384 159.044 109.781 158.511 109.781 157.185V153.217H108.683V152.125H109.781V150.367ZM118.706 157.153H120.02C119.722 158.372 118.604 159.133 117.024 159.133C115.043 159.133 113.831 157.769 113.831 155.566C113.831 153.376 115.069 151.973 117.018 151.973C118.941 151.973 120.103 153.287 120.103 155.445V155.915H115.221V155.979C115.266 157.229 115.97 158.016 117.062 158.016C117.887 158.016 118.452 157.711 118.706 157.153ZM117.011 153.084C116.002 153.084 115.297 153.82 115.221 154.931H118.712C118.681 153.814 118.021 153.084 117.011 153.084ZM121.74 159V152.106H123.054V153.154H123.156C123.353 152.475 124.121 151.986 125.022 151.986C125.225 151.986 125.485 152.005 125.631 152.037V153.319C125.517 153.287 125.111 153.243 124.87 153.243C123.835 153.243 123.105 153.909 123.105 154.88V159H121.74Z" fill="var(--vscode-quickInput-foreground, #FFFFFF)" /> </g> <g> <g> <rect x="59" y="178" width="26" height="6" rx="3" fill="var(--vscode-banner-iconForeground, #3794FF)" fill-opacity="0.6" /> <rect x="89" y="178" width="164" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)" /> </g> </g> <g> <g> <rect x="59" y="200" width="46" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)" /> <rect x="109" y="200" width="29" height="6" rx="3" fill="var(--vscode-banner-iconForeground, #3794FF)" fill-opacity="0.6" /> <rect x="142" y="200" width="46" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)" /> </g> </g> </g> </g> </g> <defs> <filter id="filter0_d_1_138" x="31" y="10" width="457" height="228" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"> <feFlood flood-opacity="0" result="BackgroundImageFix" /> <feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha" /> <feOffset dy="2" /> <feGaussianBlur stdDeviation="8" /> <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.36 0" /> <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1_138" /> <feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1_138" result="shape" /> </filter> <clipPath id="clip0_1_138"> <rect width="520" height="238" fill="var(--vscode-activityBar-activeBorder, #FFFFFF)" /> </clipPath> <clipPath id="clip1_1_138"> <rect width="115.654" height="39.2998" fill="var(--vscode-activityBar-activeBorder, #FFFFFF)" /> </clipPath> </defs> </del> <ins> <svg fill="none" viewBox="0 0 520 238" xmlns="http://www.w3.org/2000/svg"> <rect fill="var(--vscode-breadcrumb-background, #1E1E1E)"/> <g clip-path="url(#c)"> <rect width="520" height="39" fill="var(--vscode-breadcrumbPicker-background, #252526)"/> <g clip-path="url(#b)"> <rect width="115.65" height="39.3" fill="var(--vscode-breadcrumb-background, #1E1E1E)"/> <rect x="13.474" y="15.72" width="88.705" height="7.86" rx="3.93" fill="var(--vscode-tab-inactiveBackground, #2D2D2D)"/> </g> <path d="m215.24 20.222c-2.545 0-4.132-1.8409-4.132-4.7989 0-2.9643 1.58-4.8051 4.126-4.8051 2.018 0 3.58 1.2885 3.808 3.123h-1.415c-0.267-1.1362-1.187-1.8599-2.393-1.8599-1.644 0-2.673 1.3648-2.673 3.542 0 2.1773 1.029 3.5357 2.679 3.5357 1.213 0 2.133-0.6538 2.387-1.6948h1.415c-0.254 1.7837-1.758 2.958-3.802 2.958zm5.516-0.2222v-6.8936h1.314v1.0474h0.102c0.197-0.6792 0.965-1.168 1.866-1.168 0.203 0 0.463 0.0191 0.609 0.0508v1.2822c-0.114-0.0317-0.52-0.0761-0.761-0.0761-1.035 0-1.765 0.6665-1.765 1.6377v4.1196h-1.365zm9.56-1.8472h1.314c-0.299 1.2188-1.416 1.9805-2.996 1.9805-1.981 0-3.193-1.3647-3.193-3.5674 0-2.1899 1.238-3.5928 3.186-3.5928 1.924 0 3.085 1.314 3.085 3.4722v0.4697h-4.881v0.0635c0.044 1.2505 0.749 2.0376 1.841 2.0376 0.825 0 1.39-0.3047 1.644-0.8633zm-1.695-4.0688c-1.009 0-1.714 0.7363-1.79 1.8472h3.491c-0.032-1.1172-0.692-1.8472-1.701-1.8472zm6.64 6.0303c-1.333 0-2.305-0.7998-2.305-2.0567 0-1.2378 0.927-1.9551 2.571-2.0566l1.873-0.1143v-0.603c0-0.7554-0.483-1.1807-1.416-1.1807-0.761 0-1.288 0.2857-1.441 0.7871h-1.32c0.14-1.1616 1.257-1.917 2.825-1.917 1.733 0 2.71 0.8633 2.71 2.3106v4.7163h-1.314v-0.9775h-0.108c-0.412 0.6982-1.168 1.0918-2.075 1.0918zm0.349-1.0982c1.028 0 1.79-0.6728 1.79-1.5615v-0.5967l-1.689 0.1143c-0.952 0.0634-1.383 0.3999-1.383 1.0283 0 0.6411 0.539 1.0156 1.282 1.0156zm5.573-7.6489h1.365v1.7583h1.498v1.0918h-1.498v3.6372c0 0.7427 0.298 1.0664 0.977 1.0664 0.21 0 0.33-0.0127 0.521-0.0317v1.0854c-0.222 0.0381-0.476 0.0698-0.743 0.0698-1.517 0-2.12-0.5332-2.12-1.8598v-3.9673h-1.098v-1.0918h1.098v-1.7583zm8.925 6.7856h1.314c-0.299 1.2188-1.416 1.9805-2.996 1.9805-1.981 0-3.193-1.3647-3.193-3.5674 0-2.1899 1.238-3.5928 3.186-3.5928 1.924 0 3.085 1.314 3.085 3.4722v0.4697h-4.881v0.0635c0.044 1.2505 0.749 2.0376 1.841 2.0376 0.825 0 1.39-0.3047 1.644-0.8633zm-1.695-4.0688c-1.009 0-1.714 0.7363-1.79 1.8472h3.491c-0.032-1.1172-0.692-1.8472-1.701-1.8472zm8.442-3.2437h3.587c1.79 0 3.021 1.2315 3.021 3.0342 0 1.7647-1.269 2.9961-3.066 2.9961h-2.12v3.1294h-1.422v-9.1597zm1.422 1.1997v3.6372h1.79c1.225 0 1.943-0.6538 1.943-1.8027 0-1.187-0.692-1.8345-1.943-1.8345h-1.79zm6.862 7.96v-6.8936h1.314v1.0474h0.102c0.196-0.6792 0.964-1.168 1.866-1.168 0.203 0 0.463 0.0191 0.609 0.0508v1.2822c-0.114-0.0317-0.52-0.0761-0.762-0.0761-1.034 0-1.764 0.6665-1.764 1.6377v4.1196h-1.365zm7.947 0.1333c-2.025 0-3.262-1.3521-3.262-3.5801 0-2.2217 1.244-3.5801 3.262-3.5801 2.013 0 3.257 1.3521 3.257 3.5801s-1.238 3.5801-3.257 3.5801zm0-1.1616c1.181 0 1.854-0.8887 1.854-2.4185 0-1.5361-0.673-2.4248-1.854-2.4248-1.187 0-1.853 0.8887-1.853 2.4248 0 1.5362 0.666 2.4185 1.853 2.4185zm5.389 1.0283v-5.7827h-1.136v-1.0918h1.136v-0.7427c0-1.3711 0.699-2.0439 2.133-2.0439 0.311 0 0.578 0.0254 0.813 0.0634v1.0284c-0.127-0.0191-0.311-0.0318-0.527-0.0318-0.762 0-1.073 0.3491-1.073 1.0474v0.6792h1.543v1.0918h-1.524v5.7827h-1.365zm5.142-8.125c-0.476 0-0.863-0.3872-0.863-0.8569 0-0.4761 0.387-0.8633 0.863-0.8633s0.863 0.3872 0.863 0.8633c0 0.4697-0.387 0.8569-0.863 0.8569zm-0.679 8.125v-6.8936h1.358v6.8936h-1.358zm3.428 0v-9.5977h1.364v9.5977h-1.364zm7.947-1.8472h1.314c-0.298 1.2188-1.416 1.9805-2.996 1.9805-1.981 0-3.193-1.3647-3.193-3.5674 0-2.1899 1.238-3.5928 3.186-3.5928 1.924 0 3.085 1.314 3.085 3.4722v0.4697h-4.881v0.0635c0.044 1.2505 0.749 2.0376 1.841 2.0376 0.825 0 1.39-0.3047 1.644-0.8633zm-1.695-4.0688c-1.009 0-1.714 0.7363-1.79 1.8472h3.491c-0.031-1.1172-0.692-1.8472-1.701-1.8472zm5.789 6.0112c-0.533 0-0.933-0.3999-0.933-0.914 0-0.5142 0.4-0.9141 0.933-0.9141 0.54 0 0.933 0.3999 0.933 0.9141 0 0.5141-0.393 0.914-0.933 0.914zm4.101 0c-0.533 0-0.933-0.3999-0.933-0.914 0-0.5142 0.4-0.9141 0.933-0.9141 0.539 0 0.933 0.3999 0.933 0.9141 0 0.5141-0.394 0.914-0.933 0.914zm4.1 0c-0.533 0-0.933-0.3999-0.933-0.914 0-0.5142 0.4-0.9141 0.933-0.9141 0.54 0 0.933 0.3999 0.933 0.9141 0 0.5141-0.393 0.914-0.933 0.914z" fill="var(--vscode-quickInput-foreground, #FFFFFF)"/> </g> <g filter="url(#a)"> <rect transform="translate(47 24)" width="425" height="196" fill="var(--vscode-breadcrumbPicker-background, #252526)"/> <rect x="54.5" y="31.5" width="410" height="25" fill="var(--vscode-checkbox-background, #3C3C3C)"/> <rect x="54.5" y="31.5" width="410" height="25" stroke="var(--vscode-focusBorder, #007FD4)"/> <rect transform="translate(47 64)" width="425" height="24" fill="var(--vscode-peekViewEditor-background, #062F4A)"/> <path d="m65.963 79.775v1.2251h-5.8145v-9.1597h5.8145v1.2251h-4.3926v2.6787h4.1577v1.1807h-4.1577v2.8501h4.3926zm1.8979 1.2251v-6.8936h1.314v1.0982h0.1016c0.3046-0.7744 1.0029-1.2315 1.9233-1.2315 0.9458 0 1.5996 0.4888 1.9043 1.2315h0.1079c0.3491-0.7427 1.1426-1.2315 2.1011-1.2315 1.3965 0 2.209 0.8379 2.209 2.2725v4.7544h-1.3648v-4.4243c0-0.9522-0.4443-1.4155-1.3393-1.4155-0.8824 0-1.46 0.6474-1.46 1.479v4.3608h-1.3394v-4.564c0-0.7871-0.5205-1.2758-1.333-1.2758-0.8315 0-1.4599 0.7045-1.4599 1.6059v4.2339h-1.3648zm15.165-7.0142c1.7583 0 2.8691 1.3775 2.8691 3.5674 0 2.1773-1.1108 3.5611-2.8564 3.5611-0.9839 0-1.7647-0.4253-2.1265-1.1553h-0.1079v3.3389h-1.3647v-9.1915h1.3139v1.1426h0.1016c0.4189-0.7871 1.2314-1.2632 2.1709-1.2632zm-0.3872 5.9605c1.1616 0 1.8535-0.895 1.8535-2.3931 0-1.498-0.6919-2.3994-1.8472-2.3994-1.1489 0-1.8662 0.9204-1.8662 2.3994 0 1.4727 0.7173 2.3931 1.8599 2.3931zm5.3828-7.5791h1.3647v1.7583h1.4981v1.0918h-1.4981v3.6372c0 0.7427 0.2984 1.0664 0.9776 1.0664 0.2094 0 0.33-0.0127 0.5205-0.0317v1.0854c-0.2222 0.0381-0.4761 0.0698-0.7427 0.0698-1.5171 0-2.1201-0.5332-2.1201-1.8598v-3.9673h-1.0982v-1.0918h1.0982v-1.7583zm5.1543 11.134c-0.1143 0-0.438-0.0127-0.565-0.0318v-1.1171c0.108 0.019 0.3174 0.0253 0.4444 0.0253 0.6474 0 1.0156-0.2729 1.2505-1.0029l0.1015-0.3555-2.501-6.9126h1.4854l1.7329 5.5225h0.1079l1.7266-5.5225h1.4472l-2.5771 7.211c-0.5903 1.6567-1.2441 2.1836-2.6533 2.1836zm10.34-11.661h3.587c1.79 0 3.021 1.2315 3.021 3.0342 0 1.7647-1.27 2.9961-3.066 2.9961h-2.12v3.1294h-1.422v-9.1597zm1.422 1.1997v3.6372h1.79c1.225 0 1.942-0.6538 1.942-1.8027 0-1.187-0.691-1.8345-1.942-1.8345h-1.79zm6.862 7.96v-6.8936h1.314v1.0474h0.101c0.197-0.6792 0.965-1.168 1.867-1.168 0.203 0 0.463 0.0191 0.609 0.0508v1.2822c-0.114-0.0317-0.521-0.0761-0.762-0.0761-1.034 0-1.764 0.6665-1.764 1.6377v4.1196h-1.365zm7.947 0.1333c-2.025 0-3.263-1.3521-3.263-3.5801 0-2.2217 1.245-3.5801 3.263-3.5801 2.012 0 3.256 1.3521 3.256 3.5801s-1.237 3.5801-3.256 3.5801zm0-1.1616c1.181 0 1.854-0.8887 1.854-2.4185 0-1.5361-0.673-2.4248-1.854-2.4248-1.187 0-1.853 0.8887-1.853 2.4248 0 1.5362 0.666 2.4185 1.853 2.4185zm5.389 1.0283v-5.7827h-1.136v-1.0918h1.136v-0.7427c0-1.3711 0.698-2.0439 2.133-2.0439 0.311 0 0.578 0.0254 0.813 0.0634v1.0284c-0.127-0.0191-0.311-0.0318-0.527-0.0318-0.762 0-1.073 0.3491-1.073 1.0474v0.6792h1.542v1.0918h-1.523v5.7827h-1.365zm5.142-8.125c-0.476 0-0.863-0.3872-0.863-0.8569 0-0.4761 0.387-0.8633 0.863-0.8633s0.863 0.3872 0.863 0.8633c0 0.4697-0.387 0.8569-0.863 0.8569zm-0.679 8.125v-6.8936h1.358v6.8936h-1.358zm3.427 0v-9.5977h1.365v9.5977h-1.365zm7.948-1.8472h1.314c-0.299 1.2188-1.416 1.9805-2.996 1.9805-1.981 0-3.193-1.3647-3.193-3.5674 0-2.1899 1.237-3.5928 3.186-3.5928 1.923 0 3.085 1.314 3.085 3.4722v0.4697h-4.881v0.0635c0.044 1.2505 0.749 2.0376 1.841 2.0376 0.825 0 1.39-0.3047 1.644-0.8633zm-1.695-4.0688c-1.009 0-1.714 0.7363-1.79 1.8472h3.491c-0.032-1.1172-0.692-1.8472-1.701-1.8472z" fill="var(--vscode-quickInput-foreground, #FFFFFF)"/> <rect x="59" y="98" width="62.5" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)"/> <rect x="125.5" y="98" width="29" height="6" rx="3" fill="var(--vscode-banner-iconForeground, #3794FF)" fill-opacity=".6"/> <rect x="158.5" y="98" width="62.5" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)"/> <g fill="var(--vscode-quickInput-foreground, #FFFFFF)"> <path d="m60.149 123.84h3.5865c1.79 0 3.0214 1.232 3.0214 3.035 0 1.764-1.2695 2.996-3.0659 2.996h-2.1201v3.129h-1.4219v-9.16zm1.4219 1.2v3.637h1.79c1.2251 0 1.9424-0.654 1.9424-1.802 0-1.187-0.6919-1.835-1.9424-1.835h-1.79zm7.7632 10.461c-0.1143 0-0.438-0.013-0.565-0.032v-1.117c0.108 0.019 0.3174 0.025 0.4444 0.025 0.6474 0 1.0156-0.273 1.2505-1.002l0.1015-0.356-2.5009-6.913h1.4853l1.7329 5.523h0.1079l1.7266-5.523h1.4473l-2.5772 7.211c-0.5903 1.657-1.2441 2.184-2.6533 2.184zm7.1094-11.134h1.3647v1.758h1.4981v1.092h-1.4981v3.637c0 0.743 0.2983 1.067 0.9775 1.067 0.2095 0 0.3301-0.013 0.5206-0.032v1.086c-0.2222 0.038-0.4761 0.069-0.7427 0.069-1.5171 0-2.1201-0.533-2.1201-1.859v-3.968h-1.0982v-1.092h1.0982v-1.758zm4.5322 8.633v-9.598h1.352v3.803h0.1079c0.3365-0.768 1.0665-1.226 2.1075-1.226 1.4726 0 2.3803 0.934 2.3803 2.565v4.456h-1.3647v-4.132c0-1.137-0.5142-1.701-1.479-1.701-1.1172 0-1.7393 0.717-1.7393 1.796v4.037h-1.3647zm10.791 0.133c-2.0249 0-3.2627-1.352-3.2627-3.58 0-2.221 1.2441-3.58 3.2627-3.58 2.0122 0 3.2563 1.352 3.2563 3.58s-1.2377 3.58-3.2563 3.58zm0-1.161c1.1807 0 1.8535-0.889 1.8535-2.419 0-1.536-0.6728-2.425-1.8535-2.425-1.187 0-1.8535 0.889-1.8535 2.425s0.6665 2.419 1.8535 2.419zm4.9004 1.028v-6.894h1.314v1.092h0.1015c0.3364-0.761 1.022-1.225 2.0635-1.225 1.542 0 2.393 0.921 2.393 2.565v4.462h-1.365v-4.139c0-1.142-0.483-1.701-1.4919-1.701-1.0092 0-1.6504 0.686-1.6504 1.797v4.043h-1.3647z"/> <path d="m60.149 149.84h3.3072c2.7168 0 4.31 1.676 4.31 4.558 0 2.914-1.5806 4.602-4.31 4.602h-3.3072v-9.16zm1.4219 1.225v6.71h1.7266c1.917 0 3.0214-1.225 3.0214-3.358 0-2.114-1.1235-3.352-3.0214-3.352h-1.7266zm10.886 8.068c-2.0249 0-3.2627-1.352-3.2627-3.58 0-2.221 1.2442-3.58 3.2627-3.58 2.0122 0 3.2564 1.352 3.2564 3.58s-1.2378 3.58-3.2564 3.58zm0-1.161c1.1807 0 1.8535-0.889 1.8535-2.419 0-1.536-0.6728-2.425-1.8535-2.425-1.187 0-1.8535 0.889-1.8535 2.425s0.6665 2.419 1.8535 2.419zm10.753-3.65h-1.3267c-0.1587-0.673-0.7173-1.187-1.6313-1.187-1.1426 0-1.8409 0.901-1.8409 2.393 0 1.523 0.7046 2.444 1.8409 2.444 0.8632 0 1.4536-0.407 1.6313-1.156h1.3267c-0.1778 1.359-1.2442 2.317-2.9517 2.317-2.0122 0-3.2437-1.371-3.2437-3.605 0-2.19 1.2251-3.555 3.2374-3.555 1.7329 0 2.7802 1.009 2.958 2.349zm10.467-2.171-1.9614 6.849h-1.3457l-2.4692-9.16h1.479l1.6821 7.122h0.0889l1.9106-7.122h1.3203l1.9234 7.122h0.0888l1.6758-7.122h1.479l-2.4756 9.16h-1.3393l-1.9678-6.849h-0.0889zm7.0268 6.849v-6.894h1.314v1.048h0.102c0.196-0.679 0.964-1.168 1.866-1.168 0.203 0 0.463 0.019 0.609 0.051v1.282c-0.114-0.032-0.52-0.076-0.762-0.076-1.034 0-1.764 0.666-1.764 1.637v4.12h-1.365zm5.91-8.125c-0.476 0-0.864-0.387-0.864-0.857 0-0.476 0.388-0.863 0.864-0.863s0.863 0.387 0.863 0.863c0 0.47-0.387 0.857-0.863 0.857zm-0.679 8.125v-6.894h1.358v6.894h-1.358zm3.846-8.633h1.365v1.758h1.498v1.092h-1.498v3.637c0 0.743 0.298 1.067 0.978 1.067 0.209 0 0.33-0.013 0.52-0.032v1.086c-0.222 0.038-0.476 0.069-0.743 0.069-1.517 0-2.12-0.533-2.12-1.859v-3.968h-1.098v-1.092h1.098v-1.758zm8.925 6.786h1.314c-0.298 1.219-1.416 1.98-2.996 1.98-1.981 0-3.193-1.364-3.193-3.567 0-2.19 1.238-3.593 3.187-3.593 1.923 0 3.085 1.314 3.085 3.472v0.47h-4.882v0.064c0.045 1.25 0.749 2.037 1.841 2.037 0.825 0 1.39-0.305 1.644-0.863zm-1.695-4.069c-1.009 0-1.714 0.736-1.79 1.847h3.491c-0.031-1.117-0.691-1.847-1.701-1.847zm4.729 5.916v-6.894h1.314v1.048h0.102c0.197-0.679 0.965-1.168 1.866-1.168 0.203 0 0.463 0.019 0.609 0.051v1.282c-0.114-0.032-0.52-0.076-0.761-0.076-1.035 0-1.765 0.666-1.765 1.637v4.12h-1.365z"/> </g> <rect x="59" y="178" width="26" height="6" rx="3" fill="var(--vscode-banner-iconForeground, #3794FF)" fill-opacity=".6"/> <rect x="89" y="178" width="164" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)"/> <rect x="59" y="200" width="46" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)"/> <rect x="109" y="200" width="29" height="6" rx="3" fill="var(--vscode-banner-iconForeground, #3794FF)" fill-opacity=".6"/> <rect x="142" y="200" width="46" height="6" rx="3" fill="var(--vscode-editorOverviewRuler-commonContentForeground, #606060)"/> </g> <defs> <filter id="a" x="31" y="10" width="457" height="228" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"> <feFlood flood-opacity="0" result="BackgroundImageFix"/> <feColorMatrix in="SourceAlpha" result="hardAlpha" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/> <feOffset dy="2"/> <feGaussianBlur stdDeviation="8"/> <feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.36 0"/> <feBlend in2="BackgroundImageFix" result="effect1_dropShadow_1_138"/> <feBlend in="SourceGraphic" in2="effect1_dropShadow_1_138" result="shape"/> </filter> <clipPath id="c"> <rect width="520" height="238" fill="var(--vscode-activityBar-activeBorder, #FFFFFF)"/> </clipPath> <clipPath id="b"> <rect width="115.65" height="39.3" fill="var(--vscode-activityBar-activeBorder, #FFFFFF)"/> </clipPath> </defs> </ins> </svg>


weight: weight, kbExpr: EditorContextKeys.textInputFocus, primary: KeyMod.CtrlCmd | KeyCode.Space, <del> mac: { primary: KeyMod.WinCtrl | KeyCode.Space } </del> <ins> secondary: [KeyMod.CtrlCmd | KeyCode.KEY_I], mac: { primary: KeyMod.WinCtrl | KeyCode.Space, secondary: [KeyMod.CtrlCmd | KeyCode.KEY_I] } </ins> }, menuOpts: [{ menuId: suggestWidgetStatusbarMenu,


return new vscode.FoldingRange(start, end, kind); } <del> private static readonly foldEndPairCharacters = ['}', ']', ')', '`']; </del> <ins> private static readonly foldEndPairCharacters = ['}', ']', ')', '`', '>']; </ins> private adjustFoldingEnd(range: vscode.Range, document: vscode.TextDocument) { // workaround for #47240


return; } const title = this.getTooltip() ?? ''; <del> this.updateAriaLabel(); </del> <ins> this.updateAriaLabel(title); </ins> if (!this.options.hoverDelegate) { this.element.title = title; } else {


} } <del> protected updateAriaLabel(): void { </del> <ins> protected updateAriaLabel(title: string): void { </ins> if (this.element) { <del> const title = this.getTooltip() ?? ''; </del> this.element.setAttribute('aria-label', title); } }


} } <del> protected override updateAriaLabel(): void { </del> <ins> protected override updateAriaLabel(title: string): void { </ins> if (this.label) { <del> const title = this.getTooltip() ?? ''; </del> this.label.setAttribute('aria-label', title); <ins> this.label.title = title; </ins> } }


autoplayPolicy: 'user-gesture-required', // Enable experimental css highlight api https://chromestatus.com/feature/5436441440026624 // Refs https://github.com/microsoft/vscode/issues/140098 <del> enableBlinkFeatures: 'HighlightAPI', </del> <ins> enableBlinkFeatures: 'HighlightAPI, KeyboardAccessibleTooltip', </ins> ...overrides?.webPreferences, sandbox: true },


render(container: HTMLElement): void { // file/folder const label = this._labels.create(container); <ins> this._disposables.add(label.onDidRender(() => { container.title = container.children[0]?.ariaLabel ?? ''; })); </ins> label.setFile(this.element.uri, { hidePath: true, hideIcon: this.element.kind === FileKind.FOLDER || !this.options.showFileIcons,


renderElement(node: ITreeNode<OutlineElement, FuzzyScore>, _index: number, template: DocumentSymbolTemplate): void { const { element } = node; const extraClasses = ['nowrap']; <ins> const title = localize('title.template', "{0} ({1})", element.symbol.name, symbolKindNames[element.symbol.kind]); </ins> const options: IIconLabelValueOptions = { matches: createMatches(node.filterData), labelEscapeNewLines: true, extraClasses, <del> title: localize('title.template', "{0} ({1})", element.symbol.name, symbolKindNames[element.symbol.kind]) </del> <ins> title </ins> }; <ins> template.container.title = title; </ins> if (this._configurationService.getValue(OutlineConfigKeys.icons)) { // add styles for the icons template.iconClass.className = '';


hoverPreparation = toDispose; }; const mouseOverDomEmitter = dom.addDisposableListener(htmlElement, dom.EventType.MOUSE_OVER, onMouseOver, true); <ins> const onFocus = () => { if (hoverPreparation) { return; } const target: IHoverDelegateTarget = { targetElements: [htmlElement], dispose: () => { } }; const toDispose: DisposableStore = new DisposableStore(); const onBlur = () => hideHover(true, true); toDispose.add(dom.addDisposableListener(htmlElement, dom.EventType.BLUR, onBlur, true)); toDispose.add(triggerShowHover(hoverDelegate.delay, false, target)); hoverPreparation = toDispose; }; const focusDomEmitter = dom.addDisposableListener(htmlElement, dom.EventType.FOCUS, onFocus, true); </ins> const hover: ICustomHover = { show: focus => { hideHover(false, true); // terminate a ongoing mouse over preparation


}, dispose: () => { mouseOverDomEmitter.dispose(); <ins> focusDomEmitter.dispose(); </ins> hideHover(true, true); } };


} })); <ins> this._register(toDisposable(() => { this.cache.clear(); })); </ins> this._register(this.editor.onDidChangeCursorPosition((e) => { if (this.cache.value) { this.onDidChangeEmitter.fire();


]); }); }); <ins> test('Do not reuse cache from previous session (#132516)', async function () { const provider = new MockInlineCompletionsProvider(); await withAsyncTestCodeEditorAndInlineCompletionsModel('', { fakeClock: true, provider, inlineSuggest: { enabled: true } }, async ({ editor, editorViewModel, model, context }) => { model.setActive(true); context.keyboardType('hellon'); context.cursorLeft(); provider.setReturnValue({ text: 'helloworld', range: new Range(1, 1, 1, 6) }, 1000); await timeout(2000); assert.deepStrictEqual(provider.getAndClearCallHistory(), [ { position: '(1,6)', text: 'hellon', triggerKind: 0, } ]); provider.setReturnValue({ text: 'helloworld', range: new Range(2, 1, 2, 6) }, 1000); context.cursorDown(); context.keyboardType('hello'); await timeout(100); context.cursorLeft(); // Cause the ghost text to update context.cursorRight(); await timeout(2000); assert.deepStrictEqual(provider.getAndClearCallHistory(), [ { position: '(2,6)', text: 'hellonhello', triggerKind: 0, } ]); assert.deepStrictEqual(context.getAndClearViewStates(), [ '', 'hello[world]n', 'hellon', 'hellonhello[world]', ]); }); }); </ins> }); async function withAsyncTestCodeEditorAndInlineCompletionsModel<T>(


import { timeout } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Disposable } from 'vs/base/common/lifecycle'; <del> import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; </del> <ins> import { CoreEditingCommands, CoreNavigationCommands } from 'vs/editor/browser/controller/coreCommands'; </ins> import { Position } from 'vs/editor/common/core/position'; import { ITextModel } from 'vs/editor/common/model'; import { InlineCompletionsProvider, InlineCompletion, InlineCompletionContext } from 'vs/editor/common/modes';


this.editor.trigger('keyboard', 'type', { text }); } <ins> public cursorUp(): void { CoreNavigationCommands.CursorUp.runEditorCommand(null, this.editor, null); } public cursorRight(): void { CoreNavigationCommands.CursorRight.runEditorCommand(null, this.editor, null); } public cursorLeft(): void { CoreNavigationCommands.CursorLeft.runEditorCommand(null, this.editor, null); } public cursorDown(): void { CoreNavigationCommands.CursorDown.runEditorCommand(null, this.editor, null); } public cursorLineEnd(): void { CoreNavigationCommands.CursorLineEnd.runEditorCommand(null, this.editor, null); } </ins> public leftDelete(): void { CoreEditingCommands.DeleteLeft.runEditorCommand(null, this.editor, null); }


<ins> /*--------------------------------------------------------------------------------------------- *  Copyright (c) Microsoft Corporation. All rights reserved. *  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import 'mocha'; import { ExtensionContext, extensions } from 'vscode'; suite('vscode API - globalState / workspaceState', () => { let extensionContext: ExtensionContext; suiteSetup(async () => { // Trigger extension activation and grab the context as some tests depend on it await extensions.getExtension('vscode.vscode-api-tests')?.activate(); extensionContext = (global as any).testExtensionContext; }); test.only('state', async () => { for (const state of [extensionContext.globalState, extensionContext.workspaceState]) { let keys = state.keys(); assert.strictEqual(keys.length, 0); let res = state.get('state.test.get', 'default'); assert.strictEqual(res, 'default'); await state.update('state.test.get', 'testvalue'); keys = state.keys(); assert.strictEqual(keys.length, 1); assert.strictEqual(keys[0], 'state.test.get'); res = state.get('state.test.get', 'default'); assert.strictEqual(res, 'testvalue'); await state.update('state.test.get', undefined); keys = state.keys(); assert.strictEqual(keys.length, 0); res = state.get('state.test.get', 'default'); assert.strictEqual(res, 'default'); } }); }); </ins>


import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IExtensionIdWithVersion, IExtensionsStorageSyncService } from 'vs/platform/userDataSync/common/extensionsStorageSync'; <ins> import { ILogService } from 'vs/platform/log/common/log'; </ins> @extHostNamedCustomer(MainContext.MainThreadStorage) export class MainThreadStorage implements MainThreadStorageShape {


extHostContext: IExtHostContext, @IStorageService storageService: IStorageService, @IExtensionsStorageSyncService extensionsStorageSyncService: IExtensionsStorageSyncService, <ins> @ILogService private readonly _logService: ILogService </ins> ) { this._storageService = storageService; this._extensionsStorageSyncService = extensionsStorageSyncService;


this._storageListener = this._storageService.onDidChangeValue(e => { const shared = e.scope === StorageScope.GLOBAL; if (shared && this._sharedStorageKeysToWatch.has(e.key)) { <del> try { this._proxy.$acceptValue(shared, e.key, this._getValue(shared, e.key)); } catch (error) { // ignore parsing errors that can happen } </del> <ins> this._proxy.$acceptValue(shared, e.key, this._getValue(shared, e.key)); </ins> } }); }


this._storageListener.dispose(); } <del> $getValue<T>(shared: boolean, key: string): Promise<T | undefined> { </del> <ins> async $getValue<T>(shared: boolean, key: string): Promise<T | undefined> { </ins> if (shared) { this._sharedStorageKeysToWatch.set(key, true); } <del> try { return Promise.resolve(this._getValue<T>(shared, key)); } catch (error) { return Promise.reject(error); } </del> <ins> return this._getValue<T>(shared, key); </ins> } private _getValue<T>(shared: boolean, key: string): T | undefined { const jsonValue = this._storageService.get(key, shared ? StorageScope.GLOBAL : StorageScope.WORKSPACE); <del> if (!jsonValue) { return undefined; </del> <ins> if (jsonValue) { try { return JSON.parse(jsonValue); } catch (error) { // Do not fail this call but log it for diagnostics // https://github.com/microsoft/vscode/issues/132777 this._logService.error(`[mainThreadStorage] unexpected error parsing storage contents (key: ${key}, shared: ${shared}): ${error}`); } </ins> } <del> return JSON.parse(jsonValue); </del> <ins> return undefined; </ins> } <del> $setValue(shared: boolean, key: string, value: object): Promise<void> { let jsonValue: string; try { jsonValue = JSON.stringify(value); // Extension state is synced separately through extensions this._storageService.store(key, jsonValue, shared ? StorageScope.GLOBAL : StorageScope.WORKSPACE, StorageTarget.MACHINE); } catch (err) { return Promise.reject(err); } return Promise.resolve(undefined); </del> <ins> async $setValue(shared: boolean, key: string, value: object): Promise<void> { this._storageService.store(key, JSON.stringify(value), shared ? StorageScope.GLOBAL : StorageScope.WORKSPACE, StorageTarget.MACHINE /* Extension state is synced separately through extensions */); </ins> } $registerExtensionStorageKeysToSync(extension: IExtensionIdWithVersion, keys: string[]): void {


import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { revive } from 'vs/base/common/marshalling'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; <ins> import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; </ins> @extHostNamedCustomer(MainContext.MainThreadCommands) export class MainThreadCommands implements MainThreadCommandsShape {


} } <del> async $executeCommand<T>(id: string, args: any[], retry: boolean): Promise<T | undefined> { </del> <ins> async $executeCommand<T>(id: string, args: any[] | SerializableObjectWithBuffers<any[]>, retry: boolean): Promise<T | undefined> { if (args instanceof SerializableObjectWithBuffers) { args = args.value; } </ins> for (let i = 0; i < args.length; i++) { args[i] = revive(args[i]); }


export interface MainThreadCommandsShape extends IDisposable { $registerCommand(id: string): void; $unregisterCommand(id: string): void; <del> $executeCommand<T>(id: string, args: any[], retry: boolean): Promise<T | undefined>; </del> <ins> $executeCommand<T>(id: string, args: any[] | SerializableObjectWithBuffers<any[]>, retry: boolean): Promise<T | undefined>; </ins> $getCommands(): Promise<string[]>; }


import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ISelection } from 'vs/editor/common/core/selection'; import { TestItemImpl } from 'vs/workbench/api/common/extHostTestingPrivateApi'; <ins> import { VSBuffer } from 'vs/base/common/buffer'; import { SerializableObjectWithBuffers } from 'vs/workbench/services/extensions/common/proxyIdentifier'; </ins> interface CommandHandler { callback: Function;


if (Range.isIRange((obj as modes.Location).range) && URI.isUri((obj as modes.Location).uri)) { return extHostTypeConverter.location.to(obj); } <ins> if (obj instanceof VSBuffer) { return obj.buffer.buffer; } </ins> if (!Array.isArray(obj)) { return obj; }


} else { // automagically convert some argument types <ins> let hasBuffers = false; </ins> const toArgs = cloneAndChange(args, function (value) { if (value instanceof extHostTypes.Position) { return extHostTypeConverter.Position.from(value);


return extHostTypeConverter.location.from(value); } else if (extHostTypes.NotebookRange.isNotebookRange(value)) { return extHostTypeConverter.NotebookRange.from(value); <ins> } else if (value instanceof ArrayBuffer) { hasBuffers = true; return VSBuffer.wrap(new Uint8Array(value)); } else if (value instanceof Uint8Array) { hasBuffers = true; return VSBuffer.wrap(value); </ins> } if (!Array.isArray(value)) { return value;


}); try { <del> const result = await this._proxy.$executeCommand<T>(id, toArgs, retry); </del> <ins> const result = await this._proxy.$executeCommand<T>(id, hasBuffers ? new SerializableObjectWithBuffers(toArgs) : toArgs, retry); </ins> return revive<any>(result); } catch (e) { // Rerun the command when it wasn't known, had arguments, and when retry


constructor() { super({ id: 'editor.gotoPreviousFold', <del> label: nls.localize('gotoPreviousFold.label', "Go to Previous Fold"), alias: 'Go to Previous Fold', </del> <ins> label: nls.localize('gotoPreviousFold.label', "Go to Previous Folding Range"), alias: 'Go to Previous Folding Range', </ins> precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus,


constructor() { super({ id: 'editor.gotoNextFold', <del> label: nls.localize('gotoNextFold.label', "Go to Next Fold"), alias: 'Go to Next Fold', </del> <ins> label: nls.localize('gotoNextFold.label', "Go to Next Folding Range"), alias: 'Go to Next Folding Range', </ins> precondition: CONTEXT_FOLDING_ENABLED, kbOpts: { kbExpr: EditorContextKeys.editorTextFocus,


*/ export function getPreviousFoldLine(lineNumber: number, foldingModel: FoldingModel): number | null { let foldingRegion = foldingModel.getRegionAtLine(lineNumber); <del> if (foldingRegion !== null) { </del> <ins> // If on the folding range start line, go to previous sibling. if (foldingRegion !== null && foldingRegion.startLineNumber === lineNumber) { </ins> // If current line is not the start of the current fold, go to top line of current fold. If not, go to previous fold. if (lineNumber !== foldingRegion.startLineNumber) { return foldingRegion.startLineNumber;


if (foldingModel.regions.length > 0) { foldingRegion = foldingModel.regions.toRegion(foldingModel.regions.length - 1); while (foldingRegion !== null) { <del> // Found non-parent fold before current line. if (foldingRegion.parentIndex === -1 && foldingRegion.startLineNumber < lineNumber) { </del> <ins> // Found fold before current line. if (foldingRegion.startLineNumber < lineNumber) { </ins> return foldingRegion.startLineNumber; } if (foldingRegion.regionIndex > 0) {


*/ export function getNextFoldLine(lineNumber: number, foldingModel: FoldingModel): number | null { let foldingRegion = foldingModel.getRegionAtLine(lineNumber); <del> if (foldingRegion !== null) { </del> <ins> // If on the folding range start line, go to next sibling. if (foldingRegion !== null && foldingRegion.startLineNumber === lineNumber) { </ins> // Find max line number to stay within parent. let expectedParentIndex = foldingRegion.parentIndex; let maxLineNumber = 0;


if (foldingModel.regions.length > 0) { foldingRegion = foldingModel.regions.toRegion(0); while (foldingRegion !== null) { <del> // Found non-parent fold after current line. if (foldingRegion.parentIndex === -1 && foldingRegion.startLineNumber > lineNumber) { </del> <ins> // Found fold after current line. if (foldingRegion.startLineNumber > lineNumber) { </ins> return foldingRegion.startLineNumber; } if (foldingRegion.regionIndex < foldingModel.regions.length) {


assert.strictEqual(getPreviousFoldLine(9, foldingModel), 5); assert.strictEqual(getPreviousFoldLine(5, foldingModel), 3); assert.strictEqual(getPreviousFoldLine(3, foldingModel), null); <ins> // Test when not on a folding region start line. assert.strictEqual(getPreviousFoldLine(4, foldingModel), 3); assert.strictEqual(getPreviousFoldLine(7, foldingModel), 6); assert.strictEqual(getPreviousFoldLine(8, foldingModel), 6); </ins> // Test jump to next. assert.strictEqual(getNextFoldLine(3, foldingModel), 5); <del> assert.strictEqual(getNextFoldLine(4, foldingModel), 5); </del> assert.strictEqual(getNextFoldLine(5, foldingModel), 9); assert.strictEqual(getNextFoldLine(9, foldingModel), null); <ins> // Test when not on a folding region start line. assert.strictEqual(getNextFoldLine(4, foldingModel), 5); assert.strictEqual(getNextFoldLine(7, foldingModel), 9); assert.strictEqual(getNextFoldLine(8, foldingModel), 9); </ins> } finally { textModel.dispose();


} override get capabilities(): EditorInputCapabilities { <del> return EditorInputCapabilities.Readonly | EditorInputCapabilities.Singleton | EditorInputCapabilities.CanDropIntoEditor; </del> <ins> return EditorInputCapabilities.Readonly | EditorInputCapabilities.Singleton | EditorInputCapabilities.CanDropIntoEditor | EditorInputCapabilities.ForceDescription; </ins> } setTerminalInstance(instance: ITerminalInstance): void {


async attachToProcess(id: number): Promise<void> { try { <del> this._throwIfNoPty(id).attach(); </del> <ins> await this._throwIfNoPty(id).attach(); </ins> this._logService.trace(`Persistent process reconnection "${id}"`); } catch (e) { this._logService.trace(`Persistent process reconnection "${id}" failed`, e.message); <ins> throw e; </ins> } }


})); } <del> attach(): void { </del> <ins> async attach(): Promise<void> { </ins> this._logService.trace('persistentTerminalProcess#attach', this._persistentProcessId); <ins> if (!this._disconnectRunner1.isScheduled() && !this._disconnectRunner2.isScheduled()) { // Something wrong happened if the disconnect runner is not canceled, this likely means // multiple windows attempted to attach. if (!await this._isOrphaned()) { throw new Error(`Cannot attach to persistent process "${this._persistentProcessId}", it is already adopted`); } this._logService.warn(`Persistent process "${this._persistentProcessId}": Process had no disconnect runners but was an orphan`); } </ins> this._disconnectRunner1.cancel(); this._disconnectRunner2.cancel(); }


this._dimensions.rows = rows; this._isScreenReaderModeEnabled = isScreenReaderModeEnabled; <del> let newProcess: ITerminalChildProcess; </del> <ins> let newProcess: ITerminalChildProcess | undefined; </ins> if (shellLaunchConfig.customPtyImplementation) { this._processType = ProcessType.PsuedoTerminal;


if (result) { newProcess = result; } else { <del> this._logService.trace(`Attach to process failed for terminal ${shellLaunchConfig.attachPersistentProcess}`); return undefined; </del> <ins> // Warn and just create a new terminal if attach failed for some reason this._logService.warn(`Attach to process failed for terminal`, shellLaunchConfig.attachPersistentProcess); shellLaunchConfig.attachPersistentProcess = undefined; </ins> } <del> } else { </del> <ins> } if (!newProcess) { </ins> await this._terminalProfileResolverService.resolveShellLaunchConfig(shellLaunchConfig, { remoteAuthority: this.remoteAuthority, os: this.os


if (result) { newProcess = result; } else { <del> this._logService.trace(`Attach to process failed for terminal ${shellLaunchConfig.attachPersistentProcess}`); return undefined; </del> <ins> // Warn and just create a new terminal if attach failed for some reason this._logService.warn(`Attach to process failed for terminal`, shellLaunchConfig.attachPersistentProcess); shellLaunchConfig.attachPersistentProcess = undefined; </ins> } <del> } else { </del> <ins> } if (!newProcess) { </ins> newProcess = await this._launchLocalProcess(backend, shellLaunchConfig, cols, rows, this.userHome, isScreenReaderModeEnabled, variableResolver); } if (!this._isDisposed) {


if (this._preLaunchInputQueue.length > 0 && this._process) { // Send any queued data that's waiting <del> newProcess.input(this._preLaunchInputQueue.join('')); </del> <ins> newProcess!.input(this._preLaunchInputQueue.join('')); </ins> this._preLaunchInputQueue.length = 0; } }),


private async _expandTerminalInstance(t: ITerminalInstanceLayoutInfoById): Promise<IRawTerminalInstanceLayoutInfo<IProcessDetails | null>> { try { const revivedPtyId = this._revivedPtyIdMap.get(t.terminal)?.newId; <ins> this._revivedPtyIdMap.delete(t.terminal); </ins> const persistentProcessId = revivedPtyId ?? t.terminal; const persistentProcess = this._throwIfNoPty(persistentProcessId); const processDetails = persistentProcess && await this._buildProcessDetails(t.terminal, persistentProcess, revivedPtyId !== undefined);


DefaultCols = 80, DefaultRows = 30, <del> MaxSupportedCols = 5000, MaxCanvasWidth = 8000 </del> <ins> MaxCanvasWidth = 4096 </ins> } let xtermConstructor: Promise<typeof XTermTerminal> | undefined;


this._initDimensions(); await this._resize(); } else { <ins> const font = this.xterm ? this.xterm.getFont() : this._configHelper.getFont(dom.getWindow(this.domElement)); const maxColsForTexture = Math.floor(Constants.MaxCanvasWidth / (font.charWidth ?? 20)); </ins> // Fixed columns should be at least xterm.js' regular column count <del> const proposedCols = Math.max(this.maxCols, Math.min(this.xterm.getLongestViewportWrappedLineLength(), Constants.MaxSupportedCols)); </del> <ins> const proposedCols = Math.max(this.maxCols, Math.min(this.xterm.getLongestViewportWrappedLineLength(), maxColsForTexture)); </ins> // Don't switch to fixed dimensions if the content already fits as it makes the scroll // bar look bad being off the edge if (proposedCols > this.xterm.raw.cols) {


private _widgetManager: TerminalWidgetManager | undefined; private _processCwd: string | undefined; private _standardLinkProviders: ILinkProvider[] = []; <del> private _standardLinkProvidersDisposables: IDisposable[] = []; </del> <ins> private _linkProvidersDisposables: IDisposable[] = []; </ins> constructor( private _xterm: Terminal,


this._processCwd = processCwd; } <ins> private _clearLinkProviders(): void { dispose(this._linkProvidersDisposables); this._linkProvidersDisposables = []; } </ins> private _registerStandardLinkProviders(): void { <del> dispose(this._standardLinkProvidersDisposables); this._standardLinkProvidersDisposables = []; </del> for (const p of this._standardLinkProviders) { <del> this._standardLinkProvidersDisposables.push(this._xterm.registerLinkProvider(p)); </del> <ins> this._linkProvidersDisposables.push(this._xterm.registerLinkProvider(p)); </ins> } } registerExternalLinkProvider(instance: ITerminalInstance, linkProvider: ITerminalExternalLinkProvider): IDisposable { <ins> // Clear and re-register the standard link providers so they are a lower priority that the new one this._clearLinkProviders(); </ins> const wrappedLinkProvider = this._instantiationService.createInstance(TerminalExternalLinkProviderAdapter, this._xterm, instance, linkProvider, this._wrapLinkHandler.bind(this), this._tooltipCallback.bind(this)); const newLinkProvider = this._xterm.registerLinkProvider(wrappedLinkProvider); <del> // Re-register the standard link providers so they are a lower priority that the new one </del> <ins> this._linkProvidersDisposables.push(newLinkProvider); </ins> this._registerStandardLinkProviders(); return newLinkProvider; }


// Init winpty compat and link handler after process creation as they rely on the // underlying process OS this._processManager.onProcessReady((processTraits) => { <ins> // If links are ready, do not re-create the manager. if (this._areLinksReady) { return; } </ins> if (this._processManager.os === OperatingSystem.Windows) { xterm.setOption('windowsMode', processTraits.requiresWindowsMode || false); // Force line data to be sent when the cursor is moved, the main purpose for


// similar to if the app was launched from the dock // https://github.com/microsoft/vscode/issues/102975 <del> const spawnArgs = ['-n'];				// -n: launches even when opened already </del> <ins> // The following args are for the open command itself, rather than for VS Code: // -n creates a new instance. //    Without -n, the open command re-opens the existing instance as-is. // -g starts the new instance in the background. //    Later, Electron brings the instance to the foreground. //    This way, Mac does not automatically try to foreground the new instance, which causes //    focusing issues when the new instance only sends data to a previous instance and then closes. const spawnArgs = ['-n', '-g']; // -a opens the given application. </ins> spawnArgs.push('-a', process.execPath); // -a: opens a specific application if (verbose) {


const majorNodeVersion = parseInt(/^(d+)./.exec(process.versions.node)[1]); if (majorNodeVersion < 14 || majorNodeVersion >= 17) { <del> console.error('033[1;31m*** Please use node.js versions >=14 and <=17.033[0;0m'); </del> <ins> console.error('033[1;31m*** Please use node.js versions >=14 and <17.033[0;0m'); </ins> err = true; }


#!/bin/sh VSCODE_GIT_ASKPASS_PIPE=`mktemp` <del> ELECTRON_RUN_AS_NODE="1" VSCODE_GIT_ASKPASS_PIPE="$VSCODE_GIT_ASKPASS_PIPE" "$VSCODE_GIT_ASKPASS_NODE" "$VSCODE_GIT_ASKPASS_EXTRA_ARGS" "$VSCODE_GIT_ASKPASS_MAIN" $* </del> <ins> ELECTRON_RUN_AS_NODE="1" VSCODE_GIT_ASKPASS_PIPE="$VSCODE_GIT_ASKPASS_PIPE" "$VSCODE_GIT_ASKPASS_NODE" "$VSCODE_GIT_ASKPASS_MAIN" $VSCODE_GIT_ASKPASS_EXTRA_ARGS $* </ins> cat $VSCODE_GIT_ASKPASS_PIPE rm $VSCODE_GIT_ASKPASS_PIPE


margin-top: -1px; } <ins> .codicon-debug-breakpoint.codicon-debug-stackframe-focused::after, .codicon-debug-breakpoint.codicon-debug-stackframe::after { content: 'eb8a'; position: absolute; } </ins> .monaco-editor .debug-top-stack-frame-column { font: normal normal normal 16px/1 codicon; text-rendering: auto;


import { XtermTerminal } from 'vs/workbench/contrib/terminal/browser/xterm/xtermTerminal'; import { escapeNonWindowsPath } from 'vs/platform/terminal/common/terminalEnvironment'; import { IWorkspaceTrustRequestService } from 'vs/platform/workspace/common/workspaceTrust'; <ins> import { isFirefox } from 'vs/base/browser/browser'; </ins> const enum Constants { /**


} this.xterm?.dispose(); <ins> // HACK: Workaround for Firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=559561, // as 'blur' event in xterm.raw.textarea is not triggered on xterm.dispose() // See https://github.com/microsoft/vscode/issues/138358 if (isFirefox) { this._terminalFocusContextKey.reset(); this._terminalHasTextContextKey.reset(); this._onDidBlur.fire(this); } </ins> if (this._pressAnyKeyToCloseListener) { this._pressAnyKeyToCloseListener.dispose(); this._pressAnyKeyToCloseListener = undefined;


properties: { searchString: { type: 'string' }, replaceString: { type: 'string' }, <del> regex: { type: 'boolean' }, regexOverride: { type: 'number', description: nls.localize('actions.find.isRegexOverride', 'Overrides "Use Regular Expression" flag.nThe flag will not be saved for the future.n0: Do Nothingn1: Truen2: False') }, wholeWord: { type: 'boolean' }, wholeWordOverride: { type: 'number', description: nls.localize('actions.find.wholeWordOverride', 'Overrides "Match Whole Word" flag.nThe flag will not be saved for the future.n0: Do Nothingn1: Truen2: False') }, matchCase: { type: 'boolean' }, matchCaseOverride: { type: 'number', description: nls.localize('actions.find.matchCaseOverride', 'Overrides "Math Case" flag.nThe flag will not be saved for the future.n0: Do Nothingn1: Truen2: False') }, </del> <ins> isRegex: { type: 'boolean' }, matchWholeWord: { type: 'boolean' }, isCaseSensitive: { type: 'boolean' }, </ins> preserveCase: { type: 'boolean' }, <del> preserveCaseOverride: { type: 'number', description: nls.localize('actions.find.preserveCaseOverride', 'Overrides "Preserve Case" flag.nThe flag will not be saved for the future.n0: Do Nothingn1: Truen2: False') }, </del> findInSelection: { type: 'boolean' }, } }


readonly identifier = this.task.identifier; readonly source = this.task.source; <del> readonly operation = this.task.operation; </del> <ins> get operation() { return this.task.operation; } </ins> get verificationStatus() { return this.task.verificationStatus;


this._container = undefined; } attachToElement(container: HTMLElement): Promise<void> | void { // The container did not change, do nothing if (this._container === container) {


this._attachBarrier.open(); <del> this.xterm?.attachToElement(container); </del> // Attach has not occurred yet if (!this._wrapperElement) { return this._attachToElement(container); } <ins> this.xterm?.attachToElement(this._wrapperElement); </ins> // The container changed, reattach this._container = container;


"explorer/context": [ { "command": "markdown.showPreview", <del> "when": "resourceLangId == markdown", </del> <ins> "when": "resourceLangId == markdown && !hasCustomMarkdownPreview", </ins> "group": "navigation" } ], "editor/title/context": [ { "command": "markdown.showPreview", <del> "when": "resourceLangId == markdown", </del> <ins> "when": "resourceLangId == markdown && !hasCustomMarkdownPreview", </ins> "group": "1_open" } ],


'out-build/vs/base/node/ps.sh', // Terminal shell integration <del> 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration.fish', </del> 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration.ps1', 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-bash.sh', 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-env.zsh', 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-profile.zsh', 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-rc.zsh', 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration-login.zsh', <del> 'out-build/vs/workbench/contrib/terminal/browser/media/shellIntegration.fish', </del> <ins> 'out-build/vs/workbench/contrib/terminal/browser/media/fish_xdg_data/fish/vendor_conf.d/shellIntegration.fish', </ins> '!**/test/**' ];


'out-build/vs/workbench/browser/media/*-theme.css', 'out-build/vs/workbench/contrib/debug/**/*.json', 'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt', <del> 'out-build/vs/workbench/contrib/terminal/browser/media/*.fish', </del> <ins> 'out-build/vs/workbench/contrib/terminal/browser/media/fish_xdg_data/fish/vendor_conf.d/*.fish', </ins> 'out-build/vs/workbench/contrib/terminal/browser/media/*.ps1', 'out-build/vs/workbench/contrib/terminal/browser/media/*.sh', 'out-build/vs/workbench/contrib/terminal/browser/media/*.zsh',


// Usage: `[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"` case 'zsh': file = 'shellIntegration-rc.zsh'; break; // Usage: `string match -q "$TERM_PROGRAM" "vscode"; and . (code --locate-shell-integration-path fish)` <del> case 'fish': file = 'shellIntegration.fish'; break; </del> <ins> case 'fish': file = 'fish_xdg_data/fish/vendor_conf.d/shellIntegration.fish'; break; </ins> default: throw new Error('Error using --locate-shell-integration-path: Invalid shell type'); } console.log(join(getAppRoot(), 'out', 'vs', 'workbench', 'contrib', 'terminal', 'browser', 'media', file));


// The injection mechanism used for fish is to add a custom dir to $XDG_DATA_DIRS which // is similar to $ZDOTDIR in zsh but contains a list of directories to run from. const oldDataDirs = env?.XDG_DATA_DIRS ?? '/usr/local/share:/usr/share'; <del> const newDataDir = path.join(appRoot, 'out/vs/workbench/contrib/xdg_data'); </del> <ins> const newDataDir = path.join(appRoot, 'out/vs/workbench/contrib/terminal/browser/media/fish_xdg_data'); </ins> envMixin['XDG_DATA_DIRS'] = `${oldDataDirs}:${newDataDir}`; addEnvMixinPathPrefix(options, envMixin); return { newArgs: undefined, envMixin };


<ins> # --------------------------------------------------------------------------------------------- #   Copyright (c) Microsoft Corporation. All rights reserved. #   Licensed under the MIT License. See License.txt in the project root for license information. # --------------------------------------------------------------------------------------------- # # Visual Studio Code terminal integration for fish # # Manual installation: # #   (1) Add the following to the end of `$__fish_config_dir/config.fish`: # #         string match -q "$TERM_PROGRAM" "vscode" #         and . (code --locate-shell-integration-path fish) # #   (2) Restart fish. # Don't run in scripts, other terminals, or more than once per session. status is-interactive and string match --quiet "$TERM_PROGRAM" "vscode" and ! set --query VSCODE_SHELL_INTEGRATION or exit set --global VSCODE_SHELL_INTEGRATION 1 # Apply any explicit path prefix (see #99878) if status --is-login; and set -q VSCODE_PATH_PREFIX fish_add_path -p $VSCODE_PATH_PREFIX end set -e VSCODE_PATH_PREFIX # Apply EnvironmentVariableCollections if needed if test -n "$VSCODE_ENV_REPLACE" set ITEMS (string split : $VSCODE_ENV_REPLACE) for B in $ITEMS set split (string split = $B) set -gx "$split[1]" (echo -e "$split[2]") end set -e VSCODE_ENV_REPLACE end if test -n "$VSCODE_ENV_PREPEND" set ITEMS (string split : $VSCODE_ENV_PREPEND) for B in $ITEMS set split (string split = $B) set -gx "$split[1]" (echo -e "$split[2]")"$$split[1]" # avoid -p as it adds a space end set -e VSCODE_ENV_PREPEND end if test -n "$VSCODE_ENV_APPEND" set ITEMS (string split : $VSCODE_ENV_APPEND) for B in $ITEMS set split (string split = $B) set -gx "$split[1]" "$$split[1]"(echo -e "$split[2]") # avoid -a as it adds a space end set -e VSCODE_ENV_APPEND end # Handle the shell integration nonce if set -q VSCODE_NONCE set -l __vsc_nonce $VSCODE_NONCE set -e VSCODE_NONCE end # Helper function function __vsc_esc -d "Emit escape sequences for VS Code shell integration" builtin printf "e]633;%sa" (string join ";" $argv) end # Sent right before executing an interactive command. # Marks the beginning of command output. function __vsc_cmd_executed --on-event fish_preexec __vsc_esc C __vsc_esc E (__vsc_escape_value "$argv") $__vsc_nonce # Creates a marker to indicate a command was run. set --global _vsc_has_cmd end # Escape a value for use in the 'P' ("Property") or 'E' ("Command Line") sequences. # Backslashes are doubled and non-alphanumeric characters are hex encoded. function __vsc_escape_value # Escape backslashes and semi-colons echo $argv  | string replace --all '' ''  | string replace --all ';' 'x3b'  ; end # Sent right after an interactive command has finished executing. # Marks the end of command output. function __vsc_cmd_finished --on-event fish_postexec __vsc_esc D $status end # Sent when a command line is cleared or reset, but no command was run. # Marks the cleared line with neither success nor failure. function __vsc_cmd_clear --on-event fish_cancel __vsc_esc D end # Sent whenever a new fish prompt is about to be displayed. # Updates the current working directory. function __vsc_update_cwd --on-event fish_prompt __vsc_esc P Cwd=(__vsc_escape_value "$PWD") # If a command marker exists, remove it. # Otherwise, the commandline is empty and no command was run. if set --query _vsc_has_cmd set --erase _vsc_has_cmd else __vsc_cmd_clear end end # Sent at the start of the prompt. # Marks the beginning of the prompt (and, implicitly, a new line). function __vsc_fish_prompt_start __vsc_esc A end # Sent at the end of the prompt. # Marks the beginning of the user's command input. function __vsc_fish_cmd_start __vsc_esc B end function __vsc_fish_has_mode_prompt -d "Returns true if fish_mode_prompt is defined and not empty" functions fish_mode_prompt | string match -rvq '^ *(#|function |end$|$)' end # Preserve the user's existing prompt, to wrap in our escape sequences. functions --copy fish_prompt __vsc_fish_prompt # Preserve and wrap fish_mode_prompt (which appears to the left of the regular # prompt), but only if it's not defined as an empty function (which is the # officially documented way to disable that feature). if __vsc_fish_has_mode_prompt functions --copy fish_mode_prompt __vsc_fish_mode_prompt function fish_mode_prompt __vsc_fish_prompt_start __vsc_fish_mode_prompt end function fish_prompt __vsc_fish_prompt __vsc_fish_cmd_start end else # No fish_mode_prompt, so put everything in fish_prompt. function fish_prompt __vsc_fish_prompt_start __vsc_fish_prompt __vsc_fish_cmd_start end end </ins>


<del> # --------------------------------------------------------------------------------------------- #   Copyright (c) Microsoft Corporation. All rights reserved. #   Licensed under the MIT License. See License.txt in the project root for license information. # --------------------------------------------------------------------------------------------- # # Visual Studio Code terminal integration for fish # # Manual installation: # #   (1) Add the following to the end of `$__fish_config_dir/config.fish`: # #         string match -q "$TERM_PROGRAM" "vscode" #         and . (code --locate-shell-integration-path fish) # #   (2) Restart fish. # Don't run in scripts, other terminals, or more than once per session. status is-interactive and string match --quiet "$TERM_PROGRAM" "vscode" and ! set --query VSCODE_SHELL_INTEGRATION or exit set --global VSCODE_SHELL_INTEGRATION 1 # Apply any explicit path prefix (see #99878) if status --is-login; and set -q VSCODE_PATH_PREFIX fish_add_path -p $VSCODE_PATH_PREFIX end set -e VSCODE_PATH_PREFIX # Apply EnvironmentVariableCollections if needed if test -n "$VSCODE_ENV_REPLACE" set ITEMS (string split : $VSCODE_ENV_REPLACE) for B in $ITEMS set split (string split = $B) set -gx "$split[1]" (echo -e "$split[2]") end set -e VSCODE_ENV_REPLACE end if test -n "$VSCODE_ENV_PREPEND" set ITEMS (string split : $VSCODE_ENV_PREPEND) for B in $ITEMS set split (string split = $B) set -gx "$split[1]" (echo -e "$split[2]")"$$split[1]" # avoid -p as it adds a space end set -e VSCODE_ENV_PREPEND end if test -n "$VSCODE_ENV_APPEND" set ITEMS (string split : $VSCODE_ENV_APPEND) for B in $ITEMS set split (string split = $B) set -gx "$split[1]" "$$split[1]"(echo -e "$split[2]") # avoid -a as it adds a space end set -e VSCODE_ENV_APPEND end # Handle the shell integration nonce if set -q VSCODE_NONCE set -l __vsc_nonce $VSCODE_NONCE set -e VSCODE_NONCE end # Helper function function __vsc_esc -d "Emit escape sequences for VS Code shell integration" builtin printf "e]633;%sa" (string join ";" $argv) end # Sent right before executing an interactive command. # Marks the beginning of command output. function __vsc_cmd_executed --on-event fish_preexec __vsc_esc C __vsc_esc E (__vsc_escape_value "$argv") $__vsc_nonce # Creates a marker to indicate a command was run. set --global _vsc_has_cmd end # Escape a value for use in the 'P' ("Property") or 'E' ("Command Line") sequences. # Backslashes are doubled and non-alphanumeric characters are hex encoded. function __vsc_escape_value # Escape backslashes and semi-colons echo $argv  | string replace --all '' ''  | string replace --all ';' 'x3b'  ; end # Sent right after an interactive command has finished executing. # Marks the end of command output. function __vsc_cmd_finished --on-event fish_postexec __vsc_esc D $status end # Sent when a command line is cleared or reset, but no command was run. # Marks the cleared line with neither success nor failure. function __vsc_cmd_clear --on-event fish_cancel __vsc_esc D end # Sent whenever a new fish prompt is about to be displayed. # Updates the current working directory. function __vsc_update_cwd --on-event fish_prompt __vsc_esc P Cwd=(__vsc_escape_value "$PWD") # If a command marker exists, remove it. # Otherwise, the commandline is empty and no command was run. if set --query _vsc_has_cmd set --erase _vsc_has_cmd else __vsc_cmd_clear end end # Sent at the start of the prompt. # Marks the beginning of the prompt (and, implicitly, a new line). function __vsc_fish_prompt_start __vsc_esc A end # Sent at the end of the prompt. # Marks the beginning of the user's command input. function __vsc_fish_cmd_start __vsc_esc B end function __vsc_fish_has_mode_prompt -d "Returns true if fish_mode_prompt is defined and not empty" functions fish_mode_prompt | string match -rvq '^ *(#|function |end$|$)' end # Preserve the user's existing prompt, to wrap in our escape sequences. functions --copy fish_prompt __vsc_fish_prompt # Preserve and wrap fish_mode_prompt (which appears to the left of the regular # prompt), but only if it's not defined as an empty function (which is the # officially documented way to disable that feature). if __vsc_fish_has_mode_prompt functions --copy fish_mode_prompt __vsc_fish_mode_prompt function fish_mode_prompt __vsc_fish_prompt_start __vsc_fish_mode_prompt end function fish_prompt __vsc_fish_prompt __vsc_fish_cmd_start end else # No fish_mode_prompt, so put everything in fish_prompt. function fish_prompt __vsc_fish_prompt_start __vsc_fish_prompt __vsc_fish_cmd_start end end </del>


case 'fish': { // The injection mechanism used for fish is to add a custom dir to $XDG_DATA_DIRS which // is similar to $ZDOTDIR in zsh but contains a list of directories to run from. <del> // const oldDataDirs = env?.XDG_DATA_DIRS ?? '/usr/local/share:/usr/share'; // const newDataDir = path.join(appRoot, 'out/vs/workbench/contrib/terminal/browser/media/fish_xdg_data'); // envMixin['XDG_DATA_DIRS'] = `${oldDataDirs}:${newDataDir}`; // addEnvMixinPathPrefix(options, envMixin); // return { newArgs: undefined, envMixin }; return undefined; </del> <ins> const oldDataDirs = env?.XDG_DATA_DIRS ?? '/usr/local/share:/usr/share'; const newDataDir = path.join(appRoot, 'out/vs/workbench/contrib/terminal/browser/media/fish_xdg_data'); envMixin['XDG_DATA_DIRS'] = `${oldDataDirs}:${newDataDir}`; addEnvMixinPathPrefix(options, envMixin); return { newArgs: undefined, envMixin }; </ins> } case 'pwsh': { if (!originalArgs || arePwshImpliedArgs(originalArgs)) {


__vsc_esc D end <ins> # Preserve the user's existing prompt, to wrap in our escape sequences. function __preserve_fish_prompt --on-event fish_prompt if functions --query fish_prompt if functions --query __vsc_fish_prompt # Erase the fallback so it can be set to the user's prompt functions --erase __vsc_fish_prompt end functions --copy fish_prompt __vsc_fish_prompt functions --erase __preserve_fish_prompt # Now __vsc_fish_prompt is guaranteed to be defined __init_vscode_shell_integration else if functions --query __vsc_fish_prompt # There is no fish_prompt set, so stick with the default functions --erase __preserve_fish_prompt # Now __vsc_fish_prompt is guaranteed to be defined __init_vscode_shell_integration else function __vsc_fish_prompt echo -n (whoami)@(prompt_hostname) (prompt_pwd) '~> ' end end end end __preserve_fish_prompt </ins> # Sent whenever a new fish prompt is about to be displayed. # Updates the current working directory. function __vsc_update_cwd --on-event fish_prompt


functions fish_mode_prompt | string match -rvq '^ *(#|function |end$|$)' end <del> # Preserve the user's existing prompt, to wrap in our escape sequences. functions --copy fish_prompt __vsc_fish_prompt </del> # Preserve and wrap fish_mode_prompt (which appears to the left of the regular # prompt), but only if it's not defined as an empty function (which is the # officially documented way to disable that feature). <del> if __vsc_fish_has_mode_prompt functions --copy fish_mode_prompt __vsc_fish_mode_prompt function fish_mode_prompt __vsc_fish_prompt_start __vsc_fish_mode_prompt end function fish_prompt __vsc_fish_prompt __vsc_fish_cmd_start end else # No fish_mode_prompt, so put everything in fish_prompt. function fish_prompt __vsc_fish_prompt_start __vsc_fish_prompt __vsc_fish_cmd_start </del> <ins> function __init_vscode_shell_integration if __vsc_fish_has_mode_prompt functions --copy fish_mode_prompt __vsc_fish_mode_prompt function fish_mode_prompt __vsc_fish_prompt_start __vsc_fish_mode_prompt end function fish_prompt __vsc_fish_prompt __vsc_fish_cmd_start end else # No fish_mode_prompt, so put everything in fish_prompt. function fish_prompt __vsc_fish_prompt_start __vsc_fish_prompt __vsc_fish_cmd_start end </ins> end end


resourceProvider: WebviewResourceProvider, ): Promise<MarkdownContentProviderOutput> { const rendered = await this.engine.render(markdownDocument, resourceProvider); <del> const html = `<div class="markdown-body">${rendered.html}<div class="code-line" data-line="${markdownDocument.lineCount}"></div></div>`; </del> <ins> const html = `<div class="markdown-body" dir="auto">${rendered.html}<div class="code-line" data-line="${markdownDocument.lineCount}"></div></div>`; </ins> return { html, containingImages: rendered.containingImages


if (token.map && token.type !== 'inline') { token.attrSet('data-line', String(token.map[0])); token.attrJoin('class', 'code-line'); <ins> token.attrJoin('dir', 'auto'); </ins> } } });


return engine.parse(text.replace(UNICODE_NEWLINE_REGEX, ''), {}); } public resetSlugCount(): void { this._slugCount = new Map<string, number>(); }


*--------------------------------------------------------------------------------------------*/ // @ts-check const path = require('path'); <del> const fs = require('fs'); </del> const esbuild = require('esbuild'); const args = process.argv.slice(2);


const outDir = path.join(outputRoot, 'media'); async function build() { <del> fs.copyFileSync( path.join(__dirname, 'node_modules', 'vscode-codicons', 'dist', 'codicon.css'), path.join(outDir, 'codicon.css')); fs.copyFileSync( path.join(__dirname, 'node_modules', 'vscode-codicons', 'dist', 'codicon.ttf'), path.join(outDir, 'codicon.ttf')); </del> await esbuild.build({ <del> entryPoints: [ path.join(srcDir, 'index.ts') ], </del> <ins> entryPoints: { 'index': path.join(srcDir, 'index.ts'), 'codicon': path.join(__dirname, 'node_modules', 'vscode-codicons', 'dist', 'codicon.css'), }, loader: { '.ttf': 'dataurl', }, </ins> bundle: true, minify: true, sourcemap: false,


<meta http-equiv="Content-Security-Policy" content=" default-src 'none'; <del> font-src ${this._webviewPanel.webview.cspSource}; </del> <ins> font-src data:; </ins> style-src ${this._webviewPanel.webview.cspSource}; script-src 'nonce-${nonce}'; frame-src *;


disposables.push(server.onServerStart(path => { <del> defaultStatus.text = '$(flame) Runnning'; </del> <ins> defaultStatus.text = '$(flame) Running'; </ins> defaultStatus.command = 'o.pickProjectAndStart'; defaultStatus.color = ''; render();


const newRenderMode = e.altKey && e.ctrlKey ? altMode : defaultMode; if (newRenderMode !== this._activeRenderMode) { this._activeRenderMode = newRenderMode; <del> const ranges = this._getHintsRanges(); const copies = this._copyInlayHintsWithCurrentAnchor(this._editor.getModel()); this._updateHintsDecorators(ranges, copies); </del> <ins> const model = this._editor.getModel(); const copies = this._copyInlayHintsWithCurrentAnchor(model); this._updateHintsDecorators([model.getFullModelRange()], copies); </ins> scheduler.schedule(0); } }));


} // return inlay hints but with an anchor that reflects "updates" <del> // that happens after receiving them, e.g adding new lines before a hint </del> <ins> // that happened after receiving them, e.g adding new lines before a hint </ins> private _copyInlayHintsWithCurrentAnchor(model: ITextModel): InlayHintItem[] { const items = new Map<InlayHintItem, InlayHintItem>(); for (const [id, obj] of this._decorationsMetadata) {


const container = document.createElement('span'); container.classList.add('all-options'); parent.appendChild(container); <del> const action = new Action('all', localize('all', "Show Quick Pick Options..."), Codicon.chevronDown.classNames, true, () => { </del> <ins> const action = new Action('all', localize('all', "Show Search Modes..."), Codicon.chevronDown.classNames, true, () => { </ins> quickInputService.quickAccess.show('?'); }); const dropdown = new ActionViewItem(undefined, action, { icon: true, label: false, hoverDelegate });


import 'vs/css!./media/extensionEditor'; import { localize } from 'vs/nls'; import * as arrays from 'vs/base/common/arrays'; <del> import { OS } from 'vs/base/common/platform'; </del> <ins> import { OS, locale } from 'vs/base/common/platform'; </ins> import { Event, Emitter } from 'vs/base/common/event'; import { Cache, CacheResult } from 'vs/base/common/cache'; import { Action, IAction } from 'vs/base/common/actions';


append(moreInfo, $('.more-info-entry', undefined, $('div', undefined, localize('release date', "Released on")), <del> $('div', undefined, new Date(gallery.releaseDate).toLocaleString(undefined, { hourCycle: 'h23' })) </del> <ins> $('div', undefined, new Date(gallery.releaseDate).toLocaleString(locale, { hourCycle: 'h23' })) </ins> ), $('.more-info-entry', undefined, $('div', undefined, localize('last updated', "Last updated")), <del> $('div', undefined, new Date(gallery.lastUpdated).toLocaleString(undefined, { hourCycle: 'h23' })) </del> <ins> $('div', undefined, new Date(gallery.lastUpdated).toLocaleString(locale, { hourCycle: 'h23' })) </ins> ) ); }


const repoPath = path.normalize(result.stdout.trimLeft().replace(/[rn]+$/, '')); if (isWindows) { <del> // On Git 2.25+ if you call `rev-parse --show-toplevel` on a mapped drive, instead of getting the mapped drive path back, you get the UNC path for the mapped drive. // So we will try to normalize it back to the mapped drive path, if possible </del> <ins> // On Git 2.25+ if you call `rev-parse --show-toplevel` on a mapped drive, instead of getting the mapped // drive path back, you get the UNC path for the mapped drive. So we will try to normalize it back to the // mapped drive path, if possible </ins> const repoUri = Uri.file(repoPath); const pathUri = Uri.file(repositoryPath); if (repoUri.authority.length !== 0 && pathUri.authority.length === 0) {


return path.normalize(pathUri.fsPath); } <ins> // On Windows, there are cases in which the normalized path for a mapped folder contains a trailing `` // character (ex: serverfolder) due to the implementation of `path.normalize()`. This behaviour is // by design as documented in https://github.com/nodejs/node/issues/1765. if (repoUri.authority.length !== 0) { return repoPath.replace(/$/, ''); } </ins> } return repoPath;


return false; } <del> const match = /^(?:https://github.com/|git@github.com:)([^/]+)/([^/.]+)(?:.git)?$/i.exec(remoteUrl); </del> <ins> const match = /^(?:https://github.com/|git@github.com:)([^/]+)/([^/.]+)/i.exec(remoteUrl); </ins> if (!match) { return false; }


this._onDidDeleteFile.fire(Object.freeze({ files: files.map(f => URI.revive(f.target)) })); break; case FileOperation.CREATE: <ins> case FileOperation.COPY: </ins> this._onDidCreateFile.fire(Object.freeze({ files: files.map(f => URI.revive(f.target)) })); break; default:


case FileOperation.DELETE: return await this._fireWillEvent(this._onWillDeleteFile, { files: files.map(f => URI.revive(f.target)) }, timeout, token); case FileOperation.CREATE: <ins> case FileOperation.COPY: </ins> return await this._fireWillEvent(this._onWillCreateFile, { files: files.map(f => URI.revive(f.target)) }, timeout, token); } return undefined;


<del> <svg width="351" height="225" viewBox="0 0 351 225" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> </del> <ins> <svg viewBox="0 0 351 225" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> </ins> <g clip-path="url(#clip0_1103_9950)"> <rect width="350.625" height="225" fill="#1E1E1E" /> <rect width="350.625" height="225" fill="url(#paint0_radial_1103_9950)" />


return new Promise((resolve, reject) => { debugAdapter.sendRequest('initialize', { adapterID: 'test' }, (result) => { resolve(result); <del> }); </del> <ins> }, 3000); </ins> }); }


super.dispose(); dispose(this._editorListeners); <del> this._undoRedoService.removeElements(this.uri); </del> <ins> // Only remove the undo redo stack if we map this cell uri to itself // If we are not in perCell mode, it will map to the full NotebookDocument and // we don't want to remove that entire document undo / redo stack when a cell is deleted if (this._undoRedoService.getUriComparisonKey(this.uri) === this.uri.toString()) { this._undoRedoService.removeElements(this.uri); } </ins> if (this._textModelRef) { this._textModelRef.dispose();


readonly executingCommandObject: ITerminalCommand | undefined; /** The current cwd at the cursor's position. */ readonly cwd: string | undefined; <ins> /** * Whether a command is currently being input. If the a command is current not being input or * the state cannot reliably be detected the fallback of undefined will be used. */ readonly hasInput: boolean | undefined; </ins> readonly onCommandStarted: Event<ITerminalCommand>; readonly onCommandFinished: Event<ITerminalCommand>; readonly onCommandInvalidated: Event<ITerminalCommand[]>;


return undefined; } get cwd(): string | undefined { return this._cwd; } <ins> private get _isInputting(): boolean { return !!(this._currentCommand.commandStartMarker && !this._currentCommand.commandExecutedMarker); } get hasInput(): boolean | undefined { if (!this._isInputting || !this._currentCommand?.commandStartMarker) { return undefined; } if (this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY === this._currentCommand.commandStartMarker?.line) { const line = this._terminal.buffer.active.getLine(this._terminal.buffer.active.cursorY)?.translateToString(true, this._currentCommand.commandStartX); if (line === undefined) { return undefined; } return line.length > 0; } return true; } </ins> private readonly _onCommandStarted = new Emitter<ITerminalCommand>(); readonly onCommandStarted = this._onCommandStarted.event;


} this._currentCommand.commandStartX = this._terminal.buffer.active.cursorX; this._currentCommand.commandStartMarker = options?.marker || this._terminal.registerMarker(0); <ins> // Clear executed as it must happen after command start this._currentCommand.commandExecutedMarker?.dispose(); this._currentCommand.commandExecutedMarker = undefined; this._currentCommand.commandExecutedX = undefined; for (const m of this._commandMarkers) { m.dispose(); } this._commandMarkers.length = 0; </ins> this._onCommandStarted.fire({ marker: options?.marker || this._currentCommand.commandStartMarker, markProperties: options?.markProperties } as ITerminalCommand); this._logService.debug('CommandDetectionCapability#handleCommandStart', this._currentCommand.commandStartX, this._currentCommand.commandStartMarker?.line); }


import { showWithPinnedItems } from 'vs/platform/quickinput/browser/quickPickPin'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; <ins> import { timeout } from 'vs/base/common/async'; </ins> export async function showRunRecentQuickPick( accessor: ServicesAccessor,


} else { // command text = result.rawLabel; } <del> instance.sendText(text, !quickPick.keyMods.alt, true); </del> quickPick.hide(); <ins> runCommand(instance, text, !quickPick.keyMods.alt); </ins> if (quickPick.keyMods.alt) { instance.focus(); }


}); } <ins> async function runCommand(instance: ITerminalInstance, commandLine: string, addNewLine: boolean): Promise<void> { // Determine whether to send ETX (ctrl+c) before running the command. This should always // happen unless command detection can reliably say that a command is being entered and // there is no content in the prompt if (instance.capabilities.get(TerminalCapability.CommandDetection)?.hasInput !== false) { await instance.sendText('x03', false); // Wait a little before running the command to avoid the sequences being echoed while the ^C // is being evaluated await timeout(100); } // Use bracketed paste mode only when not running the command await instance.sendText(commandLine, addNewLine, !addNewLine); } </ins> class TerminalOutputProvider implements ITextModelContentProvider { static scheme = 'TERMINAL_OUTPUT';