jiebi/CodeConvo huggingface dataset:
if (contribution.scopes) { if ((!Array.isArray(contribution.scopes) || contribution.scopes.some(s => typeof s !== 'string'))) { <del> collector.error(nls.localize('invalid.scopes', "If defined, 'configuration.tokenStyleDefaults.scopes' must must be an array or strings")); </del> <ins> collector.error(nls.localize('invalid.scopes', "If defined, 'configuration.tokenStyleDefaults.scopes' must be an array or strings")); </ins> continue; } tokenStyleDefault.scopesToProbe = [contribution.scopes];
<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 nls from 'vs/nls'; import * as path from 'vs/base/common/path'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { registerEditorContribution } from 'vs/editor/browser/editorExtensions'; import { IEditorContribution } from 'vs/editor/common/editorCommon'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { URI } from 'vs/base/common/uri'; import { ITextModel } from 'vs/editor/common/model'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; /** * Shows a message when semantic tokens are shown the first time. */ export class SemanticTokensHelp extends Disposable implements IEditorContribution { public static readonly ID = 'editor.contrib.semanticHighlightHelp'; constructor( _editor: ICodeEditor, @INotificationService _notificationService: INotificationService, @IOpenerService _openerService: IOpenerService, @IWorkbenchThemeService _themeService: IWorkbenchThemeService ) { super(); const toDispose = this._register(new DisposableStore()); const localToDispose = toDispose.add(new DisposableStore()); const installChangeTokenListener = (model: ITextModel) => { localToDispose.add(model.onDidChangeTokens((e) => { if (!e.semanticTokensApplied) { return; } toDispose.dispose(); // uninstall all listeners, makes sure the notification is only shown once per window const message = nls.localize( { key: 'semanticTokensHelp', comment: [ 'Variable 0 will be a file name.', 'Variable 1 will be a theme name.' ] }, "Semantic highlighting has been applied to '{0}' as the theme '{1}' has semantic highlighting enabled.", path.basename(model.uri.path), _themeService.getColorTheme().label ); _notificationService.prompt(Severity.Info, message, [ { label: nls.localize('learnMoreButton', "Learn More"), run: () => { const url = 'https://go.microsoft.com/fwlink/?linkid=2122588'; _openerService.open(URI.parse(url)); } } ], { neverShowAgain: { id: 'editor.contrib.semanticTokensHelp' } }); })); }; const model = _editor.getModel(); if (model !== null) { installChangeTokenListener(model); } toDispose.add(_editor.onDidChangeModel((e) => { localToDispose.clear(); const model = _editor.getModel(); if (!model) { return; } installChangeTokenListener(model); })); } } registerEditorContribution(SemanticTokensHelp.ID, SemanticTokensHelp); </ins>
import { IHoverService } from 'vs/workbench/services/hover/browser/hover'; import { IHoverDelegate, IHoverDelegateOptions } from 'vs/base/browser/ui/iconLabel/iconHoverDelegate'; import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity'; <ins> import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; </ins> const ItemHeight = 22;
@IThemeService themeService: IThemeService, @ITelemetryService telemetryService: ITelemetryService, @ILabelService private readonly labelService: ILabelService, <del> @IUriIdentityService private readonly uriIdentityService: IUriIdentityService </del> <ins> @IUriIdentityService private readonly uriIdentityService: IUriIdentityService, @IExtensionService private readonly extensionService: IExtensionService, </ins> ) { super({ ...options, titleMenuId: MenuId.TimelineTitle }, keybindingService, contextMenuService, configurationService, contextKeyService, viewDescriptorService, instantiationService, openerService, themeService, telemetryService);
const viewContainer = this.getViewContainer(panelDescriptor.id); if (viewContainer?.hideIfEmpty) { const viewDescriptors = this.viewDescriptorService.getViewDescriptors(viewContainer); <del> if (viewDescriptors.activeViewDescriptors.length === 0) { </del> <ins> if (viewDescriptors.activeViewDescriptors.length === 0 && this.compositeBar.getPinnedComposites().length > 1) { </ins> this.hideComposite(panelDescriptor.id); // Update the composite bar by hiding } }
"config.enableSmartCommit": "Commit all changes when there are no staged changes.", "config.smartCommitChanges": "Control which changes are automatically staged by Smart Commit.", "config.smartCommitChanges.all": "Automatically stage all changes.", <del> "config.smartCommitChanges.tracked": "Automatically staged tracked changes only.", </del> <ins> "config.smartCommitChanges.tracked": "Automatically stage tracked changes only.", </ins> "config.suggestSmartCommit": "Suggests to enable smart commit (commit all changes when there are no staged changes).", "config.enableCommitSigning": "Enables commit signing with GPG.", "config.discardAllScope": "Controls what changes are discarded by the `Discard all changes` command. `all` discards all changes. `tracked` discards only tracked files. `prompt` shows a prompt dialog every time the action is run.",
fi fi <del> if [ ! -L $0 ]; then </del> <ins> if [ ! -L "$0" ]; then </ins> # if path is not a symlink, find relatively <del> VSCODE_PATH="$(dirname $0)/.." </del> <ins> VSCODE_PATH="$(dirname "$0")/.." </ins> else if command -v readlink >/dev/null; then # if readlink exists, follow the symlink and find relatively <del> VSCODE_PATH="$(dirname $(readlink -f $0))/.." </del> <ins> VSCODE_PATH="$(dirname $(readlink -f "$0"))/.." </ins> else # else use the standard install location VSCODE_PATH="/usr/share/@@NAME@@"
// create the suggestion resolver if (typeof provider.resolveCompletionItem !== 'function') { this._resolveCache = Promise.resolve(); <ins> this._isResolved = true; </ins> } } // resolving get isResolved() { <del> return Boolean(this._resolveCache); </del> <ins> return Boolean(this._isResolved); </ins> } private _resolveCache?: Promise<void>; <ins> private _isResolved?: boolean; </ins> async resolve(token: CancellationToken) { if (!this._resolveCache) { const sub = token.onCancellationRequested(() => { this._resolveCache = undefined; <ins> this._isResolved = false; </ins> }); this._resolveCache = Promise.resolve(this.provider.resolveCompletionItem!(this.completion, token)).then(value => { Object.assign(this.completion, value); <ins> this._isResolved = true; </ins> sub.dispose(); }, err => { if (isPromiseCanceledError(err)) { // the IPC queue will reject the request with the // cancellation error -> reset cached this._resolveCache = undefined; <ins> this._isResolved = false; </ins> } }); }
import { EditorOption } from 'vs/editor/common/config/editorOptions'; import * as platform from 'vs/base/common/platform'; import { MenuRegistry } from 'vs/platform/actions/common/actions'; <ins> import { CancellationTokenSource } from 'vs/base/common/cancellation'; </ins> // sticky suggest widget which doesn't disappear on focus out and such let _sticky = false;
// keep item in memory this._memoryService.memorize(model, this.editor.getPosition(), item); <del> const scrollState = StableEditorScrollState.capture(this.editor); </del> if (Array.isArray(item.completion.additionalTextEdits)) { <del> this.editor.executeEdits('suggestController.additionalTextEdits', item.completion.additionalTextEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text))); </del> <ins> // sync additional edits const scrollState = StableEditorScrollState.capture(this.editor); this.editor.executeEdits( 'suggestController.additionalTextEdits.sync', item.completion.additionalTextEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text)) ); scrollState.restoreRelativeVerticalPositionOfCursor(this.editor); } else if (!item.isResolved) { // async additional edits let position: IPosition | undefined; const docListener = model.onDidChangeContent(e => { if (e.isFlush) { cts.cancel(); docListener.dispose(); return; } for (let change of e.changes) { const thisPosition = Range.getEndPosition(change.range); if (!position || Position.isBefore(thisPosition, position)) { position = thisPosition; } } }); let oldFlags = flags; flags |= InsertFlags.NoAfterUndoStop; let didType = false; let typeListener = this.editor.onWillType(() => { typeListener.dispose(); didType = true; if (!(oldFlags & InsertFlags.NoAfterUndoStop)) { this.editor.pushUndoStop(); } }); tasks.push(item.resolve(cts.token).then(() => { if (!item.completion.additionalTextEdits || cts.token.isCancellationRequested) { return; } if (position && item.completion.additionalTextEdits.some(edit => Position.isBefore(position!, Range.getStartPosition(edit.range)))) { return; } if (didType) { this.editor.pushUndoStop(); } this.editor.executeEdits( 'suggestController.additionalTextEdits.async', item.completion.additionalTextEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text)) ); if (didType || !(oldFlags & InsertFlags.NoAfterUndoStop)) { this.editor.pushUndoStop(); } }).finally(() => { docListener.dispose(); typeListener.dispose(); })); </ins> } let { insertText } = item.completion;
} else { // exec command, done <del> this._commandService.executeCommand(item.completion.command.id, ...(item.completion.command.arguments ? [...item.completion.command.arguments] : [])) .catch(onUnexpectedError) .finally(() => this.model.clear()); // <- clear only now, keep commands alive </del> <ins> tasks.push(this._commandService.executeCommand(item.completion.command.id, ...(item.completion.command.arguments ? [...item.completion.command.arguments] : [])).catch(onUnexpectedError)); </ins> this.model.cancel(); } if (flags & InsertFlags.KeepAlternativeSuggestions) { this._alternatives.value.set(event, next => { <ins> // cancel resolving of additional edits cts.cancel(); </ins> // this is not so pretty. when inserting the 'next' // suggestion we undo until we are at the state at // which we were before inserting the previous suggestion...
import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; import { IMenuService, IMenu } from 'vs/platform/actions/common/actions'; import { createTextModel } from 'vs/editor/test/common/editorTestUtils'; <ins> import { Range } from 'vs/editor/common/core/range'; import { timeout } from 'vs/base/common/async'; </ins> suite('SuggestController', function () {
private cleanUp(): void { const cache = this.doLoad(); <del> // Remove groups from states that no longer exist cache.forEach((mapGroupToMemento, resource) => { </del> <ins> // Remove groups from states that no longer exist. Since we modify the // cache and its is a LRU cache make a copy to ensure iteration succeeds const entries = [...cache.entries()]; for (const [resource, mapGroupToMemento] of entries) { </ins> Object.keys(mapGroupToMemento).forEach(group => { const groupId: GroupIdentifier = Number(group); if (!this.editorGroupService.getGroup(groupId)) { delete mapGroupToMemento[groupId]; if (isEmptyObject(mapGroupToMemento)) { cache.delete(resource); } } }); <del> }); </del> <ins> } </ins> } }
} if (node.collapsible) { <del> // Do not set this before calling a handler on the super class, because it will reject it as handled e.browserEvent.isHandledByList = true; </del> const location = this.tree.getNodeLocation(node); const recursive = e.browserEvent.altKey; this.tree.setFocus([location]); this.tree.toggleCollapsed(location, recursive); if (expandOnlyOnTwistieClick && onTwistie) { <ins> // Do not set this before calling a handler on the super class, because it will reject it as handled e.browserEvent.isHandledByList = true; </ins> return; } }
return message.replace(/^s*#.*$n?/gm, '').trim(); } <ins> async getSquashMessage(): Promise<string | undefined> { const squashMsgPath = path.join(this.repositoryRoot, '.git', 'SQUASH_MSG'); try { const raw = await fs.readFile(squashMsgPath, 'utf8'); return this.stripCommitMessageComments(raw); } catch { return undefined; } } </ins> async getMergeMessage(): Promise<string | undefined> { const mergeMsgPath = path.join(this.repositoryRoot, '.git', 'MERGE_MSG');
} async getInputTemplate(): Promise<string> { <del> const mergeMessage = await this.repository.getMergeMessage(); </del> <ins> const commitMessage = (await Promise.all([this.repository.getMergeMessage(), this.repository.getSquashMessage()])).find(msg => msg !== undefined); </ins> <del> if (mergeMessage) { return mergeMessage; </del> <ins> if (commitMessage) { return commitMessage; </ins> } return await this.repository.getCommitTemplate();
} .monaco-workbench .repl .repl-tree .output.expression.value-and-source .source { <del> margin-left: 4px; </del> <ins> margin-left: auto; </ins> margin-right: 8px; cursor: pointer; text-decoration: underline; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; <del> max-width: 150px; </del> <ins> text-align: right; </ins> } .monaco-workbench .repl .repl-tree .output.expression > .value,
const filesExcludeByRoot = Array.isArray(filesExclude) ? filesExclude : []; const excludesExpression: IExpression = Array.isArray(filesExclude) ? getEmptyExpression() : filesExclude; <ins> for (const { expression } of filesExcludeByRoot) { for (const pattern of Object.keys(expression)) { if (!pattern.endsWith('/**')) { // Append `/**` to pattern to match a parent folder #103631 expression[`${strings.rtrim(pattern, '/')}/**`] = expression[pattern]; } } } </ins> const negate = filter.startsWith('!'); this.textFilter = { text: (negate ? strings.ltrim(filter, '!') : filter).trim(), negate }; const includeExpression: IExpression = getEmptyExpression();
this.render(previousRenderRange, e.scrollTop, e.height, e.scrollLeft, e.scrollWidth); if (this.supportDynamicHeights) { <del> this._rerender(e.scrollTop, e.height); </del> <ins> // Don't update scrollTop from within an scroll event // so we don't break smooth scrolling. #104144 this._rerender(e.scrollTop, e.height, false); </ins> } } catch (err) { console.error('Got bad scroll event:', e);
* Given a stable rendered state, checks every rendered element whether it needs * to be probed for dynamic height. Adjusts scroll height and top if necessary. */ <del> private _rerender(renderTop: number, renderHeight: number): void { </del> <ins> private _rerender(renderTop: number, renderHeight: number, updateScrollTop: boolean = true): void { </ins> const previousRenderRange = this.getRenderRange(renderTop, renderHeight); // Let's remember the second element's position, this helps in scrolling up
import { GetErrRoutingTsServer, ITypeScriptServer, ProcessBasedTsServer, SyntaxRoutingTsServer, TsServerDelegate, TsServerProcessFactory, TsServerProcessKind } from './server'; import { TypeScriptVersionManager } from './versionManager'; import { ITypeScriptVersionProvider, TypeScriptVersion } from './versionProvider'; <del> import * as semver from 'semver'; </del> const enum CompositeServerType { /** Run a single server that handles all commands  */
let tsServerLogFile: string | undefined; if (kind === TsServerProcessKind.Syntax) { <del> if (semver.gte(API.v400rc.fullVersionString, apiVersion.fullVersionString)) { args.push('--serverMode'); args.push('partialSemantic'); } else { </del> <ins> if (apiVersion.gte(API.v401)) { args.push('--serverMode', 'partialSemantic'); } else { </ins> args.push('--syntaxOnly'); } }
public static readonly v380 = API.fromSimpleString('3.8.0'); public static readonly v381 = API.fromSimpleString('3.8.1'); public static readonly v390 = API.fromSimpleString('3.9.0'); <del> public static readonly v400rc = API.fromSimpleString('4.0.0-rc'); </del> public static readonly v400 = API.fromSimpleString('4.0.0'); <ins> public static readonly v401 = API.fromSimpleString('4.0.1'); </ins> public static fromVersionString(versionString: string): API { let version = semver.valid(versionString);
} }, { <ins> "name": "Markdown Headings", "scope": "markup.heading.markdown", "settings": { "fontStyle": "bold" } }, { "name": "Markdown Quote", "scope": "markup.quote.markdown", "settings": { "fontStyle": "italic", "foreground": "" } }, { "name": "Markdown Bold", "scope": "markup.bold.markdown", "settings": { "fontStyle": "bold" } }, { "name": "Markdown Link Title/Description", "scope": "string.other.link.title.markdown,string.other.link.description.markdown", "settings": { "foreground": "#AE81FF" } }, { "name": "Markdown Underline Link/Image", "scope": "markup.underline.link.markdown,markup.underline.link.image.markdown", "settings": { "foreground": "" } }, { "name": "Markdown Emphasis", "scope": "markup.italic.markdown", "settings": { "fontStyle": "italic" } }, { "name": "Markdown Punctuation Definition Link", "scope": "markup.list.unnumbered.markdown, markup.list.numbered.markdown", "settings": { "foreground": "" } }, { "name": "Markdown List Punctuation", "scope": [ "punctuation.definition.list.begin.markdown" ], "settings": { "foreground": "" } }, { </ins> "scope": "token.info-token", "settings": { "foreground": "#6796e6"
*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> import { ExtensionContext } from 'vscode'; </del> <ins> import { ExtensionContext, Uri } from 'vscode'; </ins> import { LanguageClientOptions } from 'vscode-languageclient'; import { startClient, LanguageClientConstructor } from '../cssClient'; import { LanguageClient } from 'vscode-languageclient/browser';
// this method is called when vs code is activated export function activate(context: ExtensionContext) { <del> const serverMain = context.asAbsolutePath('server/dist/browser/cssServerMain.js'); </del> <ins> const serverMain = Uri.joinPath(context.extensionUri, 'server/dist/browser/cssServerMain.js'); </ins> try { <del> const worker = new Worker(serverMain); </del> <ins> const worker = new Worker(serverMain.toString()); </ins> const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { return new LanguageClient(id, name, clientOptions, worker); };
*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> import { ExtensionContext } from 'vscode'; </del> <ins> import { ExtensionContext, Uri } from 'vscode'; </ins> import { LanguageClientOptions } from 'vscode-languageclient'; import { startClient, LanguageClientConstructor } from '../htmlClient'; import { LanguageClient } from 'vscode-languageclient/browser';
// this method is called when vs code is activated export function activate(context: ExtensionContext) { <del> const serverMain = context.asAbsolutePath('server/dist/browser/htmlServerMain.js'); </del> <ins> const serverMain = Uri.joinPath(context.extensionUri, 'server/dist/browser/htmlServerMain.js'); </ins> try { <del> const worker = new Worker(serverMain); </del> <ins> const worker = new Worker(serverMain.toString()); </ins> const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { return new LanguageClient(id, name, clientOptions, worker); };
*  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ <del> import { ExtensionContext } from 'vscode'; </del> <ins> import { ExtensionContext, Uri } from 'vscode'; </ins> import { LanguageClientOptions } from 'vscode-languageclient'; import { startClient, LanguageClientConstructor } from '../jsonClient'; import { LanguageClient } from 'vscode-languageclient/browser';
// this method is called when vs code is activated export function activate(context: ExtensionContext) { <del> const serverMain = context.asAbsolutePath('server/dist/browser/jsonServerMain.js'); </del> <ins> const serverMain = Uri.joinPath(context.extensionUri, 'server/dist/browser/jsonServerMain.js'); </ins> try { <del> const worker = new Worker(serverMain); </del> <ins> const worker = new Worker(serverMain.toString()); </ins> const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { return new LanguageClient(id, name, clientOptions, worker); };
const versionProvider = new StaticVersionProvider( new TypeScriptVersion( TypeScriptVersionSource.Bundled, <del> context.asAbsolutePath('dist/browser/typescript-web/tsserver.web.js'), </del> <ins> vscode.Uri.joinPath(context.extensionUri, 'dist/browser/typescript-web/tsserver.web.js').toString(), </ins> API.v400)); const lazyClientHost = createLazyClientHost(context, false, {
"vscode-ripgrep": "^1.8.0", "vscode-sqlite3": "4.0.10", "vscode-textmate": "5.2.0", <del> "xterm": "4.9.0-beta.8", </del> <ins> "xterm": "4.9.0-beta.24", </ins> "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", "xterm-addon-webgl": "0.8.0",
"vscode-proxy-agent": "^0.5.2", "vscode-ripgrep": "^1.8.0", "vscode-textmate": "5.2.0", <del> "xterm": "4.9.0-beta.8", </del> <ins> "xterm": "4.9.0-beta.24", </ins> "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", "xterm-addon-webgl": "0.8.0",
"semver-umd": "^5.5.7", "vscode-oniguruma": "1.3.1", "vscode-textmate": "5.2.0", <del> "xterm": "4.9.0-beta.8", </del> <ins> "xterm": "4.9.0-beta.24", </ins> "xterm-addon-search": "0.7.0", "xterm-addon-unicode11": "0.2.0", "xterm-addon-webgl": "0.8.0"
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.8.0.tgz#4bc6bb4dbfea5b0d2d7978d6c5cef922d584fb4f" integrity sha512-dlpYPsv0C9S6v6+T/h/d/otSbdUTizMJdxvSoS34tUpMOHev6iW7Zqt5KRFqYxl4vCqpDk9Wmhb3fKL3kwX5fQ== <del> xterm@4.9.0-beta.8: version "4.9.0-beta.8" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.8.tgz#ca121934d63f88668d2d5b11d9b2fc3bde7bd805" integrity sha512-EEonYBLANDUBfEeEnHG632bZdgBaAUWst8LFr6oC6f2uLFfJGHQvVJuLaEkPtRvS+jOeoorEXZRPmso1/ANHXA== </del> <ins> xterm@4.9.0-beta.24: version "4.9.0-beta.24" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.24.tgz#48f0990c6d32ad3a9bcc4fb49531d7effdaccea5" integrity sha512-CIVxxxbBiSw1WOMkIjjivaiIC9jNgih4klfWsRGx0qiDF5nbzHuLXkPTt+yAQUu9FCyTUwECm9Pkl3gUsSaGKg== </ins>
resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.8.0.tgz#4bc6bb4dbfea5b0d2d7978d6c5cef922d584fb4f" integrity sha512-dlpYPsv0C9S6v6+T/h/d/otSbdUTizMJdxvSoS34tUpMOHev6iW7Zqt5KRFqYxl4vCqpDk9Wmhb3fKL3kwX5fQ== <del> xterm@4.9.0-beta.8: version "4.9.0-beta.8" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.8.tgz#ca121934d63f88668d2d5b11d9b2fc3bde7bd805" integrity sha512-EEonYBLANDUBfEeEnHG632bZdgBaAUWst8LFr6oC6f2uLFfJGHQvVJuLaEkPtRvS+jOeoorEXZRPmso1/ANHXA== </del> <ins> xterm@4.9.0-beta.24: version "4.9.0-beta.24" resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.9.0-beta.24.tgz#48f0990c6d32ad3a9bcc4fb49531d7effdaccea5" integrity sha512-CIVxxxbBiSw1WOMkIjjivaiIC9jNgih4klfWsRGx0qiDF5nbzHuLXkPTt+yAQUu9FCyTUwECm9Pkl3gUsSaGKg== </ins> yauzl@^2.9.2: version "2.10.0"
// Listen for modifier before handing it off to the hover to handle so it gets disposed correctly this._hoverListeners = new DisposableStore(); this._hoverListeners.add(dom.addDisposableListener(document, 'keydown', e => { <del> if (this._isModifierDown(e)) { </del> <ins> if (!e.repeat && this._isModifierDown(e)) { </ins> this._enableDecorations(); } })); this._hoverListeners.add(dom.addDisposableListener(document, 'keyup', e => { <del> if (!this._isModifierDown(e)) { </del> <ins> if (!e.repeat && !this._isModifierDown(e)) { </ins> this._disableDecorations(); } }));