Change:
<!-- Do Not Delete This! featurerequesttemplate --<!-- Please read our Rules of Conduct: --<!-- Please search existing issues to avoid creating duplicates. --<!-- Describe the feature you'd like. --In previous versions, with the use of and the extension, I could easily select and copy terminal output content in the "Accessible View" via Vi mode. However, in the update, I noticed a change that "The Accessible View now closes when a user starts typing and focuses the prior element for a smoother work flow.". This change prevents me from using Vi mode to select content in the "Accessible View." Could you please consider providing an option that allows users to choose whether or not this feature is enabled? Alternatively, are there any other solutions to this issue?
Related to
can you take a look at this one? Thanks!
To verify, disable and make sure the view does not close on key press.
Fixed now! Thanks for the quick resolution!

Discussion:
import { Registry } from 'vs/platform/registry/common/platform'; import { IAccessibleViewService, AccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; import { UnfocusedViewDimmingContribution } from 'vs/workbench/contrib/accessibility/browser/unfocusedViewDimmingContribution'; <del> import { EditorAccessibilityHelpContribution, HoverAccessibleViewContribution, InlineCompletionsAccessibleViewContribution, NotificationAccessibleViewContribution } from 'vs/workbench/contrib/accessibility/browser/accessibilityContributions'; </del> <ins> import { HoverAccessibleViewContribution, InlineCompletionsAccessibleViewContribution, NotificationAccessibleViewContribution } from 'vs/workbench/contrib/accessibility/browser/accessibilityContributions'; </ins> import { AccessibilityStatus } from 'vs/workbench/contrib/accessibility/browser/accessibilityStatus'; import { CommentsAccessibilityHelpContribution } from 'vs/workbench/contrib/comments/browser/comments.contribution'; import { IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; import { AccessibleNotificationService } from 'vs/workbench/contrib/accessibility/browser/accessibleNotificationService'; <ins> import { EditorAccessibilityHelpContribution } from 'vs/workbench/contrib/accessibility/browser/editorAccessibilityHelp'; </ins> registerAccessibilityConfiguration(); registerSingleton(IAccessibleViewService, AccessibleViewService, InstantiationType.Delayed);

export const enum AccessibilityWorkbenchSettingId { DimUnfocusedEnabled = 'accessibility.dimUnfocused.enabled', DimUnfocusedOpacity = 'accessibility.dimUnfocused.opacity', <del> HideAccessibleView = 'accessibility.hideAccessibleView' </del> <ins> HideAccessibleView = 'accessibility.hideAccessibleView', AccessibleViewCloseOnKeyPress = 'accessibility.accessibleView.closeOnKeyPress' </ins> } export const enum ViewDimUnfocusedOpacityProperties {

'default': SpeechTimeoutDefault, 'minimum': 0, 'tags': ['accessibility'] <del> } </del> <ins> }, [AccessibilityWorkbenchSettingId.AccessibleViewCloseOnKeyPress]: { markdownDescription: localize('terminal.integrated.accessibleView.closeOnKeyPress', "On keypress, close the accessible view and focus the element from which it was invoked."), type: 'boolean', default: true }, </ins> } };

*--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; <del> import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; </del> import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; <del> import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { AccessibilityHelpNLS } from 'vs/editor/common/standaloneStrings'; import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode'; </del> import { localize } from 'vs/nls'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { AccessibilityVerbositySettingId, AccessibleViewProviderId, accessibleViewIsShown } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; import * as strings from 'vs/base/common/strings'; <del> import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; </del> import { ICommandService } from 'vs/platform/commands/common/commands'; <del> import { NEW_UNTITLED_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileConstants'; </del> import { ModesHoverController } from 'vs/editor/contrib/hover/browser/hover'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { getNotificationFromContext } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; import { IListService, WorkbenchList } from 'vs/platform/list/browser/listService'; import { NotificationFocusedContext } from 'vs/workbench/common/contextkeys'; <del> import { IAccessibleViewService, IAccessibleContentProvider, IAccessibleViewOptions, AccessibleViewType } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; </del> <ins> import { IAccessibleViewService, IAccessibleViewOptions, AccessibleViewType } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; </ins> import { IHoverService } from 'vs/workbench/services/hover/browser/hover'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { AccessibilityHelpAction, AccessibleViewAction } from 'vs/workbench/contrib/accessibility/browser/accessibleViewActions';

import { Codicon } from 'vs/base/common/codicons'; import { InlineCompletionsController } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionsController'; import { InlineCompletionContextKeys } from 'vs/editor/contrib/inlineCompletions/browser/inlineCompletionContextKeys'; <del> import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { CommentContextKeys } from 'vs/workbench/contrib/comments/common/commentContextKeys'; import { CommentAccessibilityHelpNLS } from 'vs/workbench/contrib/comments/browser/comments.contribution'; import { CommentCommandId } from 'vs/workbench/contrib/comments/common/commentCommandIds'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { AudioCue } from 'vs/platform/audioCues/browser/audioCueService'; </del> <ins> import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; </ins> import { AccessibleNotificationEvent, IAccessibleNotificationService } from 'vs/platform/accessibility/common/accessibility'; <del> export class EditorAccessibilityHelpContribution extends Disposable { static ID: 'editorAccessibilityHelpContribution'; constructor() { super(); this._register(AccessibilityHelpAction.addImplementation(95, 'editor', async accessor => { const codeEditorService = accessor.get(ICodeEditorService); const accessibleViewService = accessor.get(IAccessibleViewService); const instantiationService = accessor.get(IInstantiationService); const commandService = accessor.get(ICommandService); let codeEditor = codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor(); if (!codeEditor) { await commandService.executeCommand(NEW_UNTITLED_FILE_COMMAND_ID); codeEditor = codeEditorService.getActiveCodeEditor()!; } accessibleViewService.show(instantiationService.createInstance(EditorAccessibilityHelpProvider, codeEditor)); }, EditorContextKeys.focus)); } } class EditorAccessibilityHelpProvider implements IAccessibleContentProvider { id = AccessibleViewProviderId.Editor; onClose() { this._editor.focus(); } options: IAccessibleViewOptions = { type: AccessibleViewType.Help, readMoreUrl: 'https://go.microsoft.com/fwlink/?linkid=851010' }; verbositySettingKey = AccessibilityVerbositySettingId.Editor; constructor( private readonly _editor: ICodeEditor, @IKeybindingService private readonly _keybindingService: IKeybindingService, @IContextKeyService private readonly _contextKeyService: IContextKeyService, @IConfigurationService private readonly _configurationService: IConfigurationService ) { } provideContent(): string { const options = this._editor.getOptions(); const content = []; if (options.get(EditorOption.inDiffEditor)) { if (options.get(EditorOption.readOnly)) { content.push(AccessibilityHelpNLS.readonlyDiffEditor); } else { content.push(AccessibilityHelpNLS.editableDiffEditor); } } else { if (options.get(EditorOption.readOnly)) { content.push(AccessibilityHelpNLS.readonlyEditor); } else { content.push(AccessibilityHelpNLS.editableEditor); } } const saveAudioCue = this._configurationService.getValue(AudioCue.save.settingsKey); switch (saveAudioCue) { case 'never': content.push(AccessibilityHelpNLS.saveAudioCueDisabled); break; case 'always': content.push(AccessibilityHelpNLS.saveAudioCueAlways); break; case 'userGesture': content.push(AccessibilityHelpNLS.saveAudioCueUserGesture); break; } const formatAudioCue = this._configurationService.getValue(AudioCue.format.settingsKey); switch (formatAudioCue) { case 'never': content.push(AccessibilityHelpNLS.formatAudioCueDisabled); break; case 'always': content.push(AccessibilityHelpNLS.formatAudioCueAlways); break; case 'userGesture': content.push(AccessibilityHelpNLS.formatAudioCueUserGesture); break; } const commentCommandInfo = getCommentCommandInfo(this._keybindingService, this._contextKeyService, this._editor); if (commentCommandInfo) { content.push(commentCommandInfo); } if (options.get(EditorOption.stickyScroll).enabled) { content.push(descriptionForCommand('editor.action.focusStickyScroll', AccessibilityHelpNLS.stickScrollKb, AccessibilityHelpNLS.stickScrollNoKb, this._keybindingService)); } if (options.get(EditorOption.tabFocusMode)) { content.push(descriptionForCommand(ToggleTabFocusModeAction.ID, AccessibilityHelpNLS.tabFocusModeOnMsg, AccessibilityHelpNLS.tabFocusModeOnMsgNoKb, this._keybindingService)); } else { content.push(descriptionForCommand(ToggleTabFocusModeAction.ID, AccessibilityHelpNLS.tabFocusModeOffMsg, AccessibilityHelpNLS.tabFocusModeOffMsgNoKb, this._keybindingService)); } return content.join('nn'); } } export function getCommentCommandInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService, editor: ICodeEditor): string | undefined { const editorContext = contextKeyService.getContext(editor.getDomNode()!); if (editorContext.getValue<boolean>(CommentContextKeys.activeEditorHasCommentingRange.key)) { const commentCommandInfo: string[] = []; commentCommandInfo.push(CommentAccessibilityHelpNLS.intro); commentCommandInfo.push(descriptionForCommand(CommentCommandId.Add, CommentAccessibilityHelpNLS.addComment, CommentAccessibilityHelpNLS.addCommentNoKb, keybindingService)); commentCommandInfo.push(descriptionForCommand(CommentCommandId.NextThread, CommentAccessibilityHelpNLS.nextCommentThreadKb, CommentAccessibilityHelpNLS.nextCommentThreadNoKb, keybindingService)); commentCommandInfo.push(descriptionForCommand(CommentCommandId.PreviousThread, CommentAccessibilityHelpNLS.previousCommentThreadKb, CommentAccessibilityHelpNLS.previousCommentThreadNoKb, keybindingService)); commentCommandInfo.push(descriptionForCommand(CommentCommandId.NextRange, CommentAccessibilityHelpNLS.nextRange, CommentAccessibilityHelpNLS.nextRangeNoKb, keybindingService)); commentCommandInfo.push(descriptionForCommand(CommentCommandId.PreviousRange, CommentAccessibilityHelpNLS.previousRange, CommentAccessibilityHelpNLS.previousRangeNoKb, keybindingService)); return commentCommandInfo.join('n'); } return; } function descriptionForCommand(commandId: string, msg: string, noKbMsg: string, keybindingService: IKeybindingService): string { </del> <ins> export function descriptionForCommand(commandId: string, msg: string, noKbMsg: string, keybindingService: IKeybindingService): string { </ins> const kb = keybindingService.lookupKeybinding(commandId); if (kb) { return strings.format(msg, kb.getAriaLabel());

}; const disposableStore = new DisposableStore(); disposableStore.add(this._editorWidget.onKeyDown((e) => { <del> if (e.keyCode === KeyCode.Escape || shouldHide(e.browserEvent, this._keybindingService)) { </del> <ins> if (e.keyCode === KeyCode.Escape || shouldHide(e.browserEvent, this._keybindingService, this._configurationService)) { </ins> hide(e); } else if (e.keyCode === KeyCode.KeyH && provider.options.readMoreUrl) { const url: string = provider.options.readMoreUrl!;

lineNumber?: number; } <del> function shouldHide(event: KeyboardEvent, keybindingService: IKeybindingService): boolean { </del> <ins> function shouldHide(event: KeyboardEvent, keybindingService: IKeybindingService, configurationService: IConfigurationService): boolean { if (!configurationService.getValue(AccessibilityWorkbenchSettingId.AccessibleViewCloseOnKeyPress)) { return false; } </ins> const standardKeyboardEvent = new StandardKeyboardEvent(event); const resolveResult = keybindingService.softDispatch(standardKeyboardEvent, standardKeyboardEvent.target);

<ins> /*--------------------------------------------------------------------------------------------- *  Copyright (c) Microsoft Corporation. All rights reserved. *  Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { AccessibilityHelpNLS } from 'vs/editor/common/standaloneStrings'; import { ToggleTabFocusModeAction } from 'vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode'; import { AudioCue } from 'vs/platform/audioCues/browser/audioCueService'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { AccessibleViewProviderId, AccessibilityVerbositySettingId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; import { descriptionForCommand } from 'vs/workbench/contrib/accessibility/browser/accessibilityContributions'; import { IAccessibleViewService, IAccessibleContentProvider, IAccessibleViewOptions, AccessibleViewType } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; import { AccessibilityHelpAction } from 'vs/workbench/contrib/accessibility/browser/accessibleViewActions'; import { CommentAccessibilityHelpNLS } from 'vs/workbench/contrib/comments/browser/comments.contribution'; import { CommentCommandId } from 'vs/workbench/contrib/comments/common/commentCommandIds'; import { CommentContextKeys } from 'vs/workbench/contrib/comments/common/commentContextKeys'; import { NEW_UNTITLED_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileConstants'; export class EditorAccessibilityHelpContribution extends Disposable { static ID: 'editorAccessibilityHelpContribution'; constructor() { super(); this._register(AccessibilityHelpAction.addImplementation(95, 'editor', async accessor => { const codeEditorService = accessor.get(ICodeEditorService); const accessibleViewService = accessor.get(IAccessibleViewService); const instantiationService = accessor.get(IInstantiationService); const commandService = accessor.get(ICommandService); let codeEditor = codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor(); if (!codeEditor) { await commandService.executeCommand(NEW_UNTITLED_FILE_COMMAND_ID); codeEditor = codeEditorService.getActiveCodeEditor()!; } accessibleViewService.show(instantiationService.createInstance(EditorAccessibilityHelpProvider, codeEditor)); }, EditorContextKeys.focus)); } } class EditorAccessibilityHelpProvider implements IAccessibleContentProvider { id = AccessibleViewProviderId.Editor; onClose() { this._editor.focus(); } options: IAccessibleViewOptions = { type: AccessibleViewType.Help, readMoreUrl: 'https://go.microsoft.com/fwlink/?linkid=851010' }; verbositySettingKey = AccessibilityVerbositySettingId.Editor; constructor( private readonly _editor: ICodeEditor, @IKeybindingService private readonly _keybindingService: IKeybindingService, @IContextKeyService private readonly _contextKeyService: IContextKeyService, @IConfigurationService private readonly _configurationService: IConfigurationService ) { } provideContent(): string { const options = this._editor.getOptions(); const content = []; if (options.get(EditorOption.inDiffEditor)) { if (options.get(EditorOption.readOnly)) { content.push(AccessibilityHelpNLS.readonlyDiffEditor); } else { content.push(AccessibilityHelpNLS.editableDiffEditor); } } else { if (options.get(EditorOption.readOnly)) { content.push(AccessibilityHelpNLS.readonlyEditor); } else { content.push(AccessibilityHelpNLS.editableEditor); } } const saveAudioCue = this._configurationService.getValue(AudioCue.save.settingsKey); switch (saveAudioCue) { case 'never': content.push(AccessibilityHelpNLS.saveAudioCueDisabled); break; case 'always': content.push(AccessibilityHelpNLS.saveAudioCueAlways); break; case 'userGesture': content.push(AccessibilityHelpNLS.saveAudioCueUserGesture); break; } const formatAudioCue = this._configurationService.getValue(AudioCue.format.settingsKey); switch (formatAudioCue) { case 'never': content.push(AccessibilityHelpNLS.formatAudioCueDisabled); break; case 'always': content.push(AccessibilityHelpNLS.formatAudioCueAlways); break; case 'userGesture': content.push(AccessibilityHelpNLS.formatAudioCueUserGesture); break; } const commentCommandInfo = getCommentCommandInfo(this._keybindingService, this._contextKeyService, this._editor); if (commentCommandInfo) { content.push(commentCommandInfo); } if (options.get(EditorOption.stickyScroll).enabled) { content.push(descriptionForCommand('editor.action.focusStickyScroll', AccessibilityHelpNLS.stickScrollKb, AccessibilityHelpNLS.stickScrollNoKb, this._keybindingService)); } if (options.get(EditorOption.tabFocusMode)) { content.push(descriptionForCommand(ToggleTabFocusModeAction.ID, AccessibilityHelpNLS.tabFocusModeOnMsg, AccessibilityHelpNLS.tabFocusModeOnMsgNoKb, this._keybindingService)); } else { content.push(descriptionForCommand(ToggleTabFocusModeAction.ID, AccessibilityHelpNLS.tabFocusModeOffMsg, AccessibilityHelpNLS.tabFocusModeOffMsgNoKb, this._keybindingService)); } return content.join('nn'); } } export function getCommentCommandInfo(keybindingService: IKeybindingService, contextKeyService: IContextKeyService, editor: ICodeEditor): string | undefined { const editorContext = contextKeyService.getContext(editor.getDomNode()!); if (editorContext.getValue<boolean>(CommentContextKeys.activeEditorHasCommentingRange.key)) { const commentCommandInfo: string[] = []; commentCommandInfo.push(CommentAccessibilityHelpNLS.intro); commentCommandInfo.push(descriptionForCommand(CommentCommandId.Add, CommentAccessibilityHelpNLS.addComment, CommentAccessibilityHelpNLS.addCommentNoKb, keybindingService)); commentCommandInfo.push(descriptionForCommand(CommentCommandId.NextThread, CommentAccessibilityHelpNLS.nextCommentThreadKb, CommentAccessibilityHelpNLS.nextCommentThreadNoKb, keybindingService)); commentCommandInfo.push(descriptionForCommand(CommentCommandId.PreviousThread, CommentAccessibilityHelpNLS.previousCommentThreadKb, CommentAccessibilityHelpNLS.previousCommentThreadNoKb, keybindingService)); commentCommandInfo.push(descriptionForCommand(CommentCommandId.NextRange, CommentAccessibilityHelpNLS.nextRange, CommentAccessibilityHelpNLS.nextRangeNoKb, keybindingService)); commentCommandInfo.push(descriptionForCommand(CommentCommandId.PreviousRange, CommentAccessibilityHelpNLS.previousRange, CommentAccessibilityHelpNLS.previousRangeNoKb, keybindingService)); return commentCommandInfo.join('n'); } return; } </ins>

import { FloatingEditorClickWidget } from 'vs/workbench/browser/codeeditor'; import { Extensions, IConfigurationMigrationRegistry } from 'vs/workbench/common/configuration'; import { AccessibilityVerbositySettingId, AccessibleViewProviderId } from 'vs/workbench/contrib/accessibility/browser/accessibilityConfiguration'; <del> import { getCommentCommandInfo } from 'vs/workbench/contrib/accessibility/browser/accessibilityContributions'; </del> import { AccessibleViewType, IAccessibleViewService } from 'vs/workbench/contrib/accessibility/browser/accessibleView'; import { AccessibilityHelpAction } from 'vs/workbench/contrib/accessibility/browser/accessibleViewActions'; <ins> import { getCommentCommandInfo } from 'vs/workbench/contrib/accessibility/browser/editorAccessibilityHelp'; </ins> import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; class DiffEditorHelperContribution extends Disposable implements IDiffEditorContribution {