mirror of
https://github.com/Microsoft/vscode
synced 2024-06-30 23:04:56 +00:00
Merge branch 'main' into joh/undoOnRequestRemove
This commit is contained in:
commit
2559f84745
|
@ -848,11 +848,11 @@ brace-expansion@^1.1.7:
|
|||
concat-map "0.0.1"
|
||||
|
||||
braces@~3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
|
||||
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
|
||||
integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
|
||||
dependencies:
|
||||
fill-range "^7.0.1"
|
||||
fill-range "^7.1.1"
|
||||
|
||||
buffer-alloc-unsafe@^1.1.0:
|
||||
version "1.1.0"
|
||||
|
@ -1371,10 +1371,10 @@ fd-slicer@~1.1.0:
|
|||
dependencies:
|
||||
pend "~1.2.0"
|
||||
|
||||
fill-range@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
|
||||
integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
|
||||
fill-range@^7.1.1:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
|
||||
integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
|
||||
dependencies:
|
||||
to-regex-range "^5.0.1"
|
||||
|
||||
|
|
|
@ -227,7 +227,7 @@ impl hyper::server::accept::Accept for PollableAsyncListener {
|
|||
}
|
||||
}
|
||||
|
||||
/// Gets a random name for a pipe/socket on the paltform
|
||||
/// Gets a random name for a pipe/socket on the platform
|
||||
pub fn get_socket_name() -> PathBuf {
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(unix)] {
|
||||
|
|
|
@ -287,7 +287,7 @@ impl StorageImplementation for ThreadKeyringStorage {
|
|||
|
||||
#[derive(Default)]
|
||||
struct KeyringStorage {
|
||||
// keywring storage can be split into multiple entries due to entry length limits
|
||||
// keyring storage can be split into multiple entries due to entry length limits
|
||||
// on Windows https://github.com/microsoft/vscode-cli/issues/358
|
||||
entries: Vec<keyring::Entry>,
|
||||
}
|
||||
|
|
|
@ -64,7 +64,7 @@ pub struct IntegratedCli {
|
|||
pub core: CliCore,
|
||||
}
|
||||
|
||||
/// Common CLI shared between intergated and standalone interfaces.
|
||||
/// Common CLI shared between integrated and standalone interfaces.
|
||||
#[derive(Args, Debug, Default, Clone)]
|
||||
pub struct CliCore {
|
||||
/// One or more files, folders, or URIs to open.
|
||||
|
@ -619,7 +619,7 @@ pub enum OutputFormat {
|
|||
#[derive(Args, Clone, Debug, Default)]
|
||||
pub struct ExistingTunnelArgs {
|
||||
/// Name you'd like to assign preexisting tunnel to use to connect the tunnel
|
||||
/// Old option, new code sohuld just use `--name`.
|
||||
/// Old option, new code should just use `--name`.
|
||||
#[clap(long, hide = true)]
|
||||
pub tunnel_name: Option<String>,
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ use crate::options::Quality;
|
|||
|
||||
pub const CONTROL_PORT: u16 = 31545;
|
||||
|
||||
/// Protocol version sent to clients. This can be used to indiciate new or
|
||||
/// Protocol version sent to clients. This can be used to indicate new or
|
||||
/// changed capabilities that clients may wish to leverage.
|
||||
/// 1 - Initial protocol version
|
||||
/// 2 - Addition of `serve.compressed` property to control whether servermsg's
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "code-oss-dev",
|
||||
"version": "1.91.0",
|
||||
"distro": "9cef7f933867933892cb3b591231ed071fe861a8",
|
||||
"distro": "a08799837ca498c02f445ca7a896f446419af238",
|
||||
"author": {
|
||||
"name": "Microsoft Corporation"
|
||||
},
|
||||
|
|
|
@ -50,8 +50,8 @@
|
|||
},
|
||||
{
|
||||
"name": "ms-vscode.js-debug",
|
||||
"version": "1.90.0",
|
||||
"sha256": "1317dd7d1ac50641c1534a3e957ecbc94349f4fbd897acb916da11eea3208a66",
|
||||
"version": "1.91.0",
|
||||
"sha256": "53b99146c7fa280f00c74414e09721530c622bf3e5eac2c967ddfb9906b51c80",
|
||||
"repo": "https://github.com/microsoft/vscode-js-debug",
|
||||
"metadata": {
|
||||
"id": "25629058-ddac-4e17-abba-74678e126c5d",
|
||||
|
|
|
@ -636,7 +636,7 @@ const plainTextRenderer = new Lazy<marked.Renderer>((withCodeBlocks?: boolean) =
|
|||
const plainTextWithCodeBlocksRenderer = new Lazy<marked.Renderer>(() => {
|
||||
const renderer = createRenderer();
|
||||
renderer.code = (code: string): string => {
|
||||
return '\n' + '```' + '\n' + code + '```' + '\n';
|
||||
return `\n\`\`\`\n${code}\n\`\`\`\n`;
|
||||
};
|
||||
return renderer;
|
||||
});
|
||||
|
@ -768,8 +768,8 @@ function completeListItemPattern(list: marked.Tokens.List): marked.Tokens.List |
|
|||
|
||||
const previousListItemsText = mergeRawTokenText(list.items.slice(0, -1));
|
||||
|
||||
// Grabbing the `- ` or `1. ` off the list item because I can't find a better way to do this
|
||||
const lastListItemLead = lastListItem.raw.match(/^(\s*(-|\d+\.) +)/)?.[0];
|
||||
// Grabbing the `- ` or `1. ` or `* ` off the list item because I can't find a better way to do this
|
||||
const lastListItemLead = lastListItem.raw.match(/^(\s*(-|\d+\.|\*) +)/)?.[0];
|
||||
if (!lastListItemLead) {
|
||||
// Is badly formatted
|
||||
return;
|
||||
|
|
|
@ -607,6 +607,15 @@ const y = 2;
|
|||
assert.deepStrictEqual(newTokens, completeTokens);
|
||||
});
|
||||
|
||||
test(`incomplete ${name} in asterisk list`, () => {
|
||||
const text = `* list item one\n* list item two and ${delimiter}text`;
|
||||
const tokens = marked.lexer(text);
|
||||
const newTokens = fillInIncompleteTokens(tokens);
|
||||
|
||||
const completeTokens = marked.lexer(text + delimiter);
|
||||
assert.deepStrictEqual(newTokens, completeTokens);
|
||||
});
|
||||
|
||||
test(`incomplete ${name} in numbered list`, () => {
|
||||
const text = `1. list item one\n2. list item two and ${delimiter}text`;
|
||||
const tokens = marked.lexer(text);
|
||||
|
|
|
@ -199,7 +199,8 @@ export class MainThreadChatAgents2 extends Disposable implements MainThreadChatA
|
|||
$updateAgent(handle: number, metadataUpdate: IExtensionChatAgentMetadata): void {
|
||||
const data = this._agents.get(handle);
|
||||
if (!data) {
|
||||
throw new Error(`No agent with handle ${handle} registered`);
|
||||
this._logService.error(`MainThreadChatAgents2#$updateAgent: No agent with handle ${handle} registered`);
|
||||
return;
|
||||
}
|
||||
data.hasFollowups = metadataUpdate.hasFollowups;
|
||||
this._chatAgentService.updateAgent(data.id, revive(metadataUpdate));
|
||||
|
|
|
@ -185,6 +185,7 @@ export class MainThreadCommentThread<T> implements languages.CommentThread<T> {
|
|||
public threadId: string,
|
||||
public resource: string,
|
||||
private _range: T | undefined,
|
||||
comments: languages.Comment[] | undefined,
|
||||
private _canReply: boolean,
|
||||
private _isTemplate: boolean,
|
||||
public editorId?: string
|
||||
|
@ -192,6 +193,8 @@ export class MainThreadCommentThread<T> implements languages.CommentThread<T> {
|
|||
this._isDisposed = false;
|
||||
if (_isTemplate) {
|
||||
this.comments = [];
|
||||
} else if (comments) {
|
||||
this._comments = comments;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -298,6 +301,7 @@ export class MainThreadCommentController implements ICommentController {
|
|||
threadId: string,
|
||||
resource: UriComponents,
|
||||
range: IRange | ICellRange | undefined,
|
||||
comments: languages.Comment[],
|
||||
isTemplate: boolean,
|
||||
editorId?: string
|
||||
): languages.CommentThread<IRange | ICellRange> {
|
||||
|
@ -308,6 +312,7 @@ export class MainThreadCommentController implements ICommentController {
|
|||
threadId,
|
||||
URI.revive(resource).toString(),
|
||||
range,
|
||||
comments,
|
||||
true,
|
||||
isTemplate,
|
||||
editorId
|
||||
|
@ -590,6 +595,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments
|
|||
threadId: string,
|
||||
resource: UriComponents,
|
||||
range: IRange | ICellRange | undefined,
|
||||
comments: languages.Comment[],
|
||||
extensionId: ExtensionIdentifier,
|
||||
isTemplate: boolean,
|
||||
editorId?: string
|
||||
|
@ -600,7 +606,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments
|
|||
return undefined;
|
||||
}
|
||||
|
||||
return provider.createCommentThread(extensionId.value, commentThreadHandle, threadId, resource, range, isTemplate, editorId);
|
||||
return provider.createCommentThread(extensionId.value, commentThreadHandle, threadId, resource, range, comments, isTemplate, editorId);
|
||||
}
|
||||
|
||||
$updateCommentThread(handle: number,
|
||||
|
|
|
@ -144,7 +144,7 @@ export interface MainThreadCommentsShape extends IDisposable {
|
|||
$registerCommentController(handle: number, id: string, label: string, extensionId: string): void;
|
||||
$unregisterCommentController(handle: number): void;
|
||||
$updateCommentControllerFeatures(handle: number, features: CommentProviderFeatures): void;
|
||||
$createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange | ICellRange | undefined, extensionId: ExtensionIdentifier, isTemplate: boolean, editorId?: string): languages.CommentThread<IRange | ICellRange> | undefined;
|
||||
$createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange | ICellRange | undefined, comments: languages.Comment[], extensionId: ExtensionIdentifier, isTemplate: boolean, editorId?: string): languages.CommentThread<IRange | ICellRange> | undefined;
|
||||
$updateCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, changes: CommentThreadChanges): void;
|
||||
$deleteCommentThread(handle: number, commentThreadHandle: number): void;
|
||||
$updateCommentingRanges(handle: number, resourceHints?: languages.CommentingRangeResourceHint): void;
|
||||
|
|
|
@ -424,6 +424,7 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo
|
|||
this._id,
|
||||
this._uri,
|
||||
extHostTypeConverter.Range.from(this._range),
|
||||
this._comments.map(cmt => convertToDTOComment(this, cmt, this._commentsMap, this.extensionDescription)),
|
||||
extensionDescription.identifier,
|
||||
this._isTemplate,
|
||||
editorId
|
||||
|
@ -436,9 +437,6 @@ export function createExtHostComments(mainContext: IMainContext, commands: ExtHo
|
|||
this.eventuallyUpdateCommentThread();
|
||||
}));
|
||||
|
||||
// set up comments after ctor to batch update events.
|
||||
this.comments = _comments;
|
||||
|
||||
this._localDisposables.push({
|
||||
dispose: () => {
|
||||
proxy.$deleteCommentThread(
|
||||
|
|
|
@ -161,6 +161,7 @@ export class CancelAction extends Action2 {
|
|||
keybinding: {
|
||||
weight: KeybindingWeight.WorkbenchContrib,
|
||||
primary: KeyMod.CtrlCmd | KeyCode.Escape,
|
||||
win: { primary: KeyMod.Alt | KeyCode.Backspace },
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
|
@ -34,6 +34,8 @@ import { SEARCH_RESULT_LANGUAGE_ID } from 'vs/workbench/services/search/common/s
|
|||
import { getDefaultHoverDelegate } from 'vs/base/browser/ui/hover/hoverDelegateFactory';
|
||||
import { IHoverService } from 'vs/platform/hover/browser/hover';
|
||||
import { ChatAgentLocation, IChatAgent, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents';
|
||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { StandardMouseEvent } from 'vs/base/browser/mouseEvent';
|
||||
|
||||
const $ = dom.$;
|
||||
|
||||
|
@ -60,6 +62,7 @@ export class EmptyTextEditorHintContribution implements IEditorContribution {
|
|||
@IChatAgentService private readonly chatAgentService: IChatAgentService,
|
||||
@ITelemetryService private readonly telemetryService: ITelemetryService,
|
||||
@IProductService protected readonly productService: IProductService,
|
||||
@IContextMenuService private readonly contextMenuService: IContextMenuService
|
||||
) {
|
||||
this.toDispose = [];
|
||||
this.toDispose.push(this.editor.onDidChangeModel(() => this.update()));
|
||||
|
@ -145,7 +148,8 @@ export class EmptyTextEditorHintContribution implements IEditorContribution {
|
|||
this.keybindingService,
|
||||
this.chatAgentService,
|
||||
this.telemetryService,
|
||||
this.productService
|
||||
this.productService,
|
||||
this.contextMenuService
|
||||
);
|
||||
} else if (!shouldRenderHint && this.textHintContentWidget) {
|
||||
this.textHintContentWidget.dispose();
|
||||
|
@ -178,7 +182,8 @@ class EmptyTextEditorHintContentWidget implements IContentWidget {
|
|||
private readonly keybindingService: IKeybindingService,
|
||||
private readonly chatAgentService: IChatAgentService,
|
||||
private readonly telemetryService: ITelemetryService,
|
||||
private readonly productService: IProductService
|
||||
private readonly productService: IProductService,
|
||||
private readonly contextMenuService: IContextMenuService,
|
||||
) {
|
||||
this.toDispose = new DisposableStore();
|
||||
this.toDispose.add(this.editor.onDidChangeConfiguration((e: ConfigurationChangedEvent) => {
|
||||
|
@ -199,10 +204,34 @@ class EmptyTextEditorHintContentWidget implements IContentWidget {
|
|||
return EmptyTextEditorHintContentWidget.ID;
|
||||
}
|
||||
|
||||
private _disableHint() {
|
||||
this.configurationService.updateValue(emptyTextEditorHintSetting, 'hidden');
|
||||
this.dispose();
|
||||
this.editor.focus();
|
||||
private _disableHint(e?: MouseEvent) {
|
||||
const disableHint = () => {
|
||||
this.configurationService.updateValue(emptyTextEditorHintSetting, 'hidden');
|
||||
this.dispose();
|
||||
this.editor.focus();
|
||||
};
|
||||
|
||||
if (!e) {
|
||||
disableHint();
|
||||
return;
|
||||
}
|
||||
|
||||
this.contextMenuService.showContextMenu({
|
||||
getAnchor: () => { return new StandardMouseEvent(dom.getActiveWindow(), e); },
|
||||
getActions: () => {
|
||||
return [{
|
||||
id: 'workench.action.disableEmptyEditorHint',
|
||||
label: localize('disableEditorEmptyHint', "Disable Empty Editor Hint"),
|
||||
tooltip: localize('disableEditorEmptyHint', "Disable Empty Editor Hint"),
|
||||
enabled: true,
|
||||
class: undefined,
|
||||
run: () => {
|
||||
disableHint();
|
||||
}
|
||||
}
|
||||
];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private _getHintInlineChat(providers: IChatAgent[]) {
|
||||
|
@ -244,7 +273,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget {
|
|||
const hintPart = $('a', undefined, fragment);
|
||||
hintPart.style.fontStyle = 'italic';
|
||||
hintPart.style.cursor = 'pointer';
|
||||
this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CONTEXT_MENU, () => this._disableHint()));
|
||||
this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CONTEXT_MENU, (e) => this._disableHint(e)));
|
||||
this.toDispose.add(dom.addDisposableListener(hintPart, dom.EventType.CLICK, handleClick));
|
||||
return hintPart;
|
||||
} else {
|
||||
|
@ -263,7 +292,7 @@ class EmptyTextEditorHintContentWidget implements IContentWidget {
|
|||
|
||||
if (this.options.clickable) {
|
||||
label.element.style.cursor = 'pointer';
|
||||
this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CONTEXT_MENU, () => this._disableHint()));
|
||||
this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CONTEXT_MENU, (e) => this._disableHint(e)));
|
||||
this.toDispose.add(dom.addDisposableListener(label.element, dom.EventType.CLICK, handleClick));
|
||||
}
|
||||
|
||||
|
|
|
@ -51,9 +51,9 @@ export const CONTEXT_IN_DEBUG_REPL = new RawContextKey<boolean>('inDebugRepl', f
|
|||
export const CONTEXT_BREAKPOINT_WIDGET_VISIBLE = new RawContextKey<boolean>('breakpointWidgetVisible', false, { type: 'boolean', description: nls.localize('breakpointWidgetVisibile', "True when breakpoint editor zone widget is visible, false otherwise.") });
|
||||
export const CONTEXT_IN_BREAKPOINT_WIDGET = new RawContextKey<boolean>('inBreakpointWidget', false, { type: 'boolean', description: nls.localize('inBreakpointWidget', "True when focus is in the breakpoint editor zone widget, false otherwise.") });
|
||||
export const CONTEXT_BREAKPOINTS_FOCUSED = new RawContextKey<boolean>('breakpointsFocused', true, { type: 'boolean', description: nls.localize('breakpointsFocused', "True when the BREAKPOINTS view is focused, false otherwise.") });
|
||||
export const CONTEXT_WATCH_EXPRESSIONS_FOCUSED = new RawContextKey<boolean>('watchExpressionsFocused', true, { type: 'boolean', description: nls.localize('watchExpressionsFocused', "True when the WATCH view is focused, false otherwsie.") });
|
||||
export const CONTEXT_WATCH_EXPRESSIONS_FOCUSED = new RawContextKey<boolean>('watchExpressionsFocused', true, { type: 'boolean', description: nls.localize('watchExpressionsFocused', "True when the WATCH view is focused, false otherwise.") });
|
||||
export const CONTEXT_WATCH_EXPRESSIONS_EXIST = new RawContextKey<boolean>('watchExpressionsExist', false, { type: 'boolean', description: nls.localize('watchExpressionsExist', "True when at least one watch expression exists, false otherwise.") });
|
||||
export const CONTEXT_VARIABLES_FOCUSED = new RawContextKey<boolean>('variablesFocused', true, { type: 'boolean', description: nls.localize('variablesFocused', "True when the VARIABLES views is focused, false otherwsie") });
|
||||
export const CONTEXT_VARIABLES_FOCUSED = new RawContextKey<boolean>('variablesFocused', true, { type: 'boolean', description: nls.localize('variablesFocused', "True when the VARIABLES views is focused, false otherwise") });
|
||||
export const CONTEXT_EXPRESSION_SELECTED = new RawContextKey<boolean>('expressionSelected', false, { type: 'boolean', description: nls.localize('expressionSelected', "True when an expression input box is open in either the WATCH or the VARIABLES view, false otherwise.") });
|
||||
export const CONTEXT_BREAKPOINT_INPUT_FOCUSED = new RawContextKey<boolean>('breakpointInputFocused', false, { type: 'boolean', description: nls.localize('breakpointInputFocused', "True when the input box has focus in the BREAKPOINTS view.") });
|
||||
export const CONTEXT_CALLSTACK_ITEM_TYPE = new RawContextKey<string>('callStackItemType', undefined, { type: 'string', description: nls.localize('callStackItemType', "Represents the item type of the focused element in the CALL STACK view. For example: 'session', 'thread', 'stackFrame'") });
|
||||
|
@ -72,7 +72,7 @@ export const CONTEXT_FOCUSED_SESSION_IS_ATTACH = new RawContextKey<boolean>('foc
|
|||
export const CONTEXT_FOCUSED_SESSION_IS_NO_DEBUG = new RawContextKey<boolean>('focusedSessionIsNoDebug', false, { type: 'boolean', description: nls.localize('focusedSessionIsNoDebug', "True when the focused session is run without debugging.") });
|
||||
export const CONTEXT_STEP_BACK_SUPPORTED = new RawContextKey<boolean>('stepBackSupported', false, { type: 'boolean', description: nls.localize('stepBackSupported', "True when the focused session supports 'stepBack' requests.") });
|
||||
export const CONTEXT_RESTART_FRAME_SUPPORTED = new RawContextKey<boolean>('restartFrameSupported', false, { type: 'boolean', description: nls.localize('restartFrameSupported', "True when the focused session supports 'restartFrame' requests.") });
|
||||
export const CONTEXT_STACK_FRAME_SUPPORTS_RESTART = new RawContextKey<boolean>('stackFrameSupportsRestart', false, { type: 'boolean', description: nls.localize('stackFrameSupportsRestart', "True when the focused stack frame suppots 'restartFrame'.") });
|
||||
export const CONTEXT_STACK_FRAME_SUPPORTS_RESTART = new RawContextKey<boolean>('stackFrameSupportsRestart', false, { type: 'boolean', description: nls.localize('stackFrameSupportsRestart', "True when the focused stack frame supports 'restartFrame'.") });
|
||||
export const CONTEXT_JUMP_TO_CURSOR_SUPPORTED = new RawContextKey<boolean>('jumpToCursorSupported', false, { type: 'boolean', description: nls.localize('jumpToCursorSupported', "True when the focused session supports 'jumpToCursor' request.") });
|
||||
export const CONTEXT_STEP_INTO_TARGETS_SUPPORTED = new RawContextKey<boolean>('stepIntoTargetsSupported', false, { type: 'boolean', description: nls.localize('stepIntoTargetsSupported', "True when the focused session supports 'stepIntoTargets' request.") });
|
||||
export const CONTEXT_BREAKPOINTS_EXIST = new RawContextKey<boolean>('breakpointsExist', false, { type: 'boolean', description: nls.localize('breakpointsExist', "True when at least one breakpoint exists.") });
|
||||
|
|
|
@ -1493,7 +1493,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
|
|||
menu: {
|
||||
id: MenuId.ExtensionContext,
|
||||
group: '0_install',
|
||||
when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), CONTEXT_SYNC_ENABLEMENT),
|
||||
when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.not('extensionDisallowInstall'), CONTEXT_SYNC_ENABLEMENT),
|
||||
order: 1
|
||||
},
|
||||
run: async (accessor: ServicesAccessor, extensionId: string) => {
|
||||
|
@ -1516,7 +1516,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
|
|||
menu: {
|
||||
id: MenuId.ExtensionContext,
|
||||
group: '0_install',
|
||||
when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.has('extensionHasPreReleaseVersion'), CONTEXT_SYNC_ENABLEMENT),
|
||||
when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.has('extensionHasPreReleaseVersion'), ContextKeyExpr.not('extensionDisallowInstall'), CONTEXT_SYNC_ENABLEMENT),
|
||||
order: 2
|
||||
},
|
||||
run: async (accessor: ServicesAccessor, extensionId: string) => {
|
||||
|
@ -1540,7 +1540,7 @@ class ExtensionsContributions extends Disposable implements IWorkbenchContributi
|
|||
menu: {
|
||||
id: MenuId.ExtensionContext,
|
||||
group: '0_install',
|
||||
when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension')),
|
||||
when: ContextKeyExpr.and(ContextKeyExpr.equals('extensionStatus', 'uninstalled'), ContextKeyExpr.has('isGalleryExtension'), ContextKeyExpr.not('extensionDisallowInstall')),
|
||||
order: 3
|
||||
},
|
||||
run: async (accessor: ServicesAccessor, extensionId: string) => {
|
||||
|
|
|
@ -1170,6 +1170,7 @@ async function getContextMenuActionsGroups(extension: IExtension | undefined | n
|
|||
cksOverlay.push(['galleryExtensionHasPreReleaseVersion', extension.gallery?.hasPreReleaseVersion]);
|
||||
cksOverlay.push(['extensionHasPreReleaseVersion', extension.hasPreReleaseVersion]);
|
||||
cksOverlay.push(['extensionHasReleaseVersion', extension.hasReleaseVersion]);
|
||||
cksOverlay.push(['extensionDisallowInstall', !!extension.deprecationInfo?.disallowInstall]);
|
||||
|
||||
const [colorThemes, fileIconThemes, productIconThemes] = await Promise.all([workbenchThemeService.getColorThemes(), workbenchThemeService.getFileIconThemes(), workbenchThemeService.getProductIconThemes()]);
|
||||
cksOverlay.push(['extensionHasColorThemes', colorThemes.some(theme => isThemeFromExtension(theme, extension))]);
|
||||
|
|
|
@ -50,6 +50,7 @@ import { generateUuid } from 'vs/base/common/uuid';
|
|||
import { isEqual } from 'vs/base/common/resources';
|
||||
import { ChatAgentLocation } from 'vs/workbench/contrib/chat/common/chatAgents';
|
||||
import { INotebookEditorService } from 'vs/workbench/contrib/notebook/browser/services/notebookEditorService';
|
||||
import { escapeRegExpCharacters } from 'vs/base/common/strings';
|
||||
|
||||
export const enum State {
|
||||
CREATE_SESSION = 'CREATE_SESSION',
|
||||
|
@ -463,7 +464,7 @@ export class InlineChatController implements IEditorContribution {
|
|||
}));
|
||||
|
||||
// #region DEBT
|
||||
// DEBT@jrieken
|
||||
// DEBT@jrieken https://github.com/microsoft/vscode/issues/218819
|
||||
// REMOVE when agents are adopted
|
||||
this._sessionStore.add(this._languageFeatureService.completionProvider.register({ scheme: ChatInputPart.INPUT_SCHEME, hasAccessToAllModels: true }, {
|
||||
_debugDisplayName: 'inline chat commands',
|
||||
|
@ -486,7 +487,7 @@ export class InlineChatController implements IEditorContribution {
|
|||
result.suggestions.push({
|
||||
label: { label: withSlash, description: command.description ?? '' },
|
||||
kind: CompletionItemKind.Text,
|
||||
insertText: withSlash,
|
||||
insertText: `${withSlash} `,
|
||||
range: Range.fromPositions(new Position(1, 1), position),
|
||||
});
|
||||
}
|
||||
|
@ -501,16 +502,12 @@ export class InlineChatController implements IEditorContribution {
|
|||
for (const command of (this._session?.agent.slashCommands ?? []).sort((a, b) => b.name.length - a.name.length)) {
|
||||
const withSlash = `/${command.name}`;
|
||||
const firstLine = model.getLineContent(1);
|
||||
if (firstLine.startsWith(withSlash)) {
|
||||
if (firstLine.match(new RegExp(`^${escapeRegExpCharacters(withSlash)}(\\s|$)`))) {
|
||||
newDecorations.push({
|
||||
range: new Range(1, 1, 1, withSlash.length + 1),
|
||||
options: {
|
||||
description: 'inline-chat-slash-command',
|
||||
inlineClassName: 'inline-chat-slash-command',
|
||||
after: {
|
||||
// Force some space between slash command and placeholder
|
||||
content: ' '
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
|
|
@ -458,6 +458,11 @@ registerAction2(class extends Action2 {
|
|||
title: localize2('interactive.execute', 'Execute Code'),
|
||||
category: interactiveWindowCategory,
|
||||
keybinding: [{
|
||||
// when: NOTEBOOK_CELL_LIST_FOCUSED,
|
||||
when: ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'),
|
||||
primary: KeyMod.CtrlCmd | KeyCode.Enter,
|
||||
weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT
|
||||
}, {
|
||||
when: ContextKeyExpr.and(
|
||||
ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'),
|
||||
ContextKeyExpr.equals('config.interactiveWindow.executeWithShiftEnter', true)
|
||||
|
@ -471,11 +476,6 @@ registerAction2(class extends Action2 {
|
|||
),
|
||||
primary: KeyCode.Enter,
|
||||
weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT
|
||||
}, {
|
||||
// when: NOTEBOOK_CELL_LIST_FOCUSED,
|
||||
when: ContextKeyExpr.equals('activeEditor', 'workbench.editor.interactive'),
|
||||
primary: KeyMod.CtrlCmd | KeyCode.Enter,
|
||||
weight: NOTEBOOK_EDITOR_WIDGET_ACTION_WEIGHT
|
||||
}],
|
||||
menu: [
|
||||
{
|
||||
|
|
|
@ -122,23 +122,25 @@ export class ReplInputHintContentWidget extends Disposable implements IContentWi
|
|||
private getKeybinding() {
|
||||
const keybindings = this.keybindingService.lookupKeybindings('interactive.execute');
|
||||
const shiftEnterConfig = this.configurationService.getValue(InteractiveWindowSetting.executeWithShiftEnter);
|
||||
const hasChord = (chord: string, kb: ResolvedKeybinding) => {
|
||||
const hasEnterChord = (kb: ResolvedKeybinding, modifier: string = '') => {
|
||||
const chords = kb.getDispatchChords();
|
||||
return chords.length === 1 && chords[0] === chord;
|
||||
const chord = modifier + 'Enter';
|
||||
const chordAlt = modifier + '[Enter]';
|
||||
return chords.length === 1 && (chords[0] === chord || chords[0] === chordAlt);
|
||||
};
|
||||
|
||||
if (shiftEnterConfig) {
|
||||
const keybinding = keybindings.find(kb => hasChord('shift+Enter', kb));
|
||||
const keybinding = keybindings.find(kb => hasEnterChord(kb, 'shift+'));
|
||||
if (keybinding) {
|
||||
return keybinding;
|
||||
}
|
||||
} else {
|
||||
let keybinding = keybindings.find(kb => hasChord('Enter', kb));
|
||||
let keybinding = keybindings.find(kb => hasEnterChord(kb));
|
||||
if (keybinding) {
|
||||
return keybinding;
|
||||
}
|
||||
keybinding = this.keybindingService.lookupKeybindings('python.execInREPLEnter')
|
||||
.find(kb => hasChord('Enter', kb));
|
||||
.find(kb => hasEnterChord(kb));
|
||||
if (keybinding) {
|
||||
return keybinding;
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
|||
import { EditorContributionInstantiation, registerEditorContribution } from 'vs/editor/browser/editorExtensions';
|
||||
import { ICommandService } from 'vs/platform/commands/common/commands';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
|
||||
import { IHoverService } from 'vs/platform/hover/browser/hover';
|
||||
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
|
||||
import { IProductService } from 'vs/platform/product/common/productService';
|
||||
|
@ -32,7 +33,8 @@ export class EmptyCellEditorHintContribution extends EmptyTextEditorHintContribu
|
|||
@IInlineChatSessionService inlineChatSessionService: IInlineChatSessionService,
|
||||
@IChatAgentService chatAgentService: IChatAgentService,
|
||||
@ITelemetryService telemetryService: ITelemetryService,
|
||||
@IProductService productService: IProductService
|
||||
@IProductService productService: IProductService,
|
||||
@IContextMenuService contextMenuService: IContextMenuService
|
||||
) {
|
||||
super(
|
||||
editor,
|
||||
|
@ -44,7 +46,8 @@ export class EmptyCellEditorHintContribution extends EmptyTextEditorHintContribu
|
|||
inlineChatSessionService,
|
||||
chatAgentService,
|
||||
telemetryService,
|
||||
productService
|
||||
productService,
|
||||
contextMenuService
|
||||
);
|
||||
|
||||
const activeEditor = getNotebookEditorFromEditorPane(this._editorService.activeEditorPane);
|
||||
|
|
|
@ -175,7 +175,9 @@ __vsc_stable="$VSCODE_STABLE"
|
|||
unset VSCODE_STABLE
|
||||
|
||||
# Report continuation prompt
|
||||
builtin printf "\e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/\x1b/\\\\x1b/g')\a"
|
||||
if [ "$__vsc_stable" = "0" ]; then
|
||||
builtin printf "\e]633;P;ContinuationPrompt=$(echo "$PS2" | sed 's/\x1b/\\\\x1b/g')\a"
|
||||
fi
|
||||
|
||||
__vsc_report_prompt() {
|
||||
# Expand the original PS1 similarly to how bash would normally
|
||||
|
|
|
@ -98,7 +98,7 @@ function Global:Prompt() {
|
|||
|
||||
# Prompt
|
||||
# OSC 633 ; <Property>=<Value> ST
|
||||
if ($isStable -eq "1") {
|
||||
if ($isStable -eq "0") {
|
||||
$Result += "$([char]0x1b)]633;P;Prompt=$(__VSCode-Escape-Value $OriginalPrompt)`a"
|
||||
}
|
||||
|
||||
|
@ -147,9 +147,11 @@ else {
|
|||
}
|
||||
|
||||
# Set ContinuationPrompt property
|
||||
$ContinuationPrompt = (Get-PSReadLineOption).ContinuationPrompt
|
||||
if ($ContinuationPrompt) {
|
||||
[Console]::Write("$([char]0x1b)]633;P;ContinuationPrompt=$(__VSCode-Escape-Value $ContinuationPrompt)`a")
|
||||
if ($isStable -eq "0") {
|
||||
$ContinuationPrompt = (Get-PSReadLineOption).ContinuationPrompt
|
||||
if ($ContinuationPrompt) {
|
||||
[Console]::Write("$([char]0x1b)]633;P;ContinuationPrompt=$(__VSCode-Escape-Value $ContinuationPrompt)`a")
|
||||
}
|
||||
}
|
||||
|
||||
# Set always on key handlers which map to default VS Code keybindings
|
||||
|
|
|
@ -261,6 +261,7 @@ class TerminalInitialHintWidget extends Disposable {
|
|||
};
|
||||
this.toDispose.add(this.commandService.onDidExecuteCommand(e => {
|
||||
if (e.commandId === TerminalChatCommandId.Start) {
|
||||
this._storageService.store(Constants.InitialHintHideStorageKey, true, StorageScope.APPLICATION, StorageTarget.USER);
|
||||
this.dispose();
|
||||
}
|
||||
}));
|
||||
|
|
|
@ -96,11 +96,14 @@ export class TerminalChatWidget extends Disposable {
|
|||
this._container.appendChild(this._inlineChatWidget.domNode);
|
||||
|
||||
this._focusTracker = this._register(trackFocus(this._container));
|
||||
this._register(this._focusTracker.onDidFocus(() => this._focusedContextKey.set(true)));
|
||||
this._register(this._focusTracker.onDidBlur(() => {
|
||||
this._focusedContextKey.set(false);
|
||||
if (!this.inlineChatWidget.responseContent) {
|
||||
this.hide();
|
||||
}
|
||||
}));
|
||||
|
||||
this.hide();
|
||||
}
|
||||
|
||||
|
@ -150,7 +153,6 @@ export class TerminalChatWidget extends Disposable {
|
|||
reveal(): void {
|
||||
this._doLayout(this._inlineChatWidget.contentHeight);
|
||||
this._container.classList.remove('hide');
|
||||
this._focusedContextKey.set(true);
|
||||
this._visibleContextKey.set(true);
|
||||
this._inlineChatWidget.focus();
|
||||
this._instance.scrollToBottom();
|
||||
|
@ -199,7 +201,6 @@ export class TerminalChatWidget extends Disposable {
|
|||
this._inlineChatWidget.updateChatMessage(undefined);
|
||||
this._inlineChatWidget.updateProgress(false);
|
||||
this._inlineChatWidget.updateToolbar(false);
|
||||
this._focusedContextKey.set(false);
|
||||
this._visibleContextKey.set(false);
|
||||
this._inlineChatWidget.value = '';
|
||||
this._instance.focus();
|
||||
|
|
|
@ -716,14 +716,14 @@ export class UserDataProfilesEditorModel extends EditorModel {
|
|||
localize('active', "Use for Current Window"),
|
||||
ThemeIcon.asClassName(Codicon.check),
|
||||
true,
|
||||
() => this.userDataProfileManagementService.switchProfile(profile)
|
||||
() => this.userDataProfileManagementService.switchProfile(profileElement.profile)
|
||||
));
|
||||
|
||||
const copyFromProfileAction = disposables.add(new Action(
|
||||
'userDataProfile.copyFromProfile',
|
||||
localize('copyFromProfile', "Duplicate..."),
|
||||
ThemeIcon.asClassName(Codicon.copy),
|
||||
true, () => this.createNewProfile(profile)
|
||||
true, () => this.createNewProfile(profileElement.profile)
|
||||
));
|
||||
|
||||
const exportAction = disposables.add(new Action(
|
||||
|
@ -731,7 +731,7 @@ export class UserDataProfilesEditorModel extends EditorModel {
|
|||
localize('export', "Export..."),
|
||||
ThemeIcon.asClassName(Codicon.export),
|
||||
true,
|
||||
() => this.exportProfile(profile)
|
||||
() => this.exportProfile(profileElement.profile)
|
||||
));
|
||||
|
||||
const deleteAction = disposables.add(new Action(
|
||||
|
@ -739,20 +739,20 @@ export class UserDataProfilesEditorModel extends EditorModel {
|
|||
localize('delete', "Delete"),
|
||||
ThemeIcon.asClassName(Codicon.trash),
|
||||
true,
|
||||
() => this.removeProfile(profile)
|
||||
() => this.removeProfile(profileElement.profile)
|
||||
));
|
||||
|
||||
const newWindowAction = disposables.add(new Action(
|
||||
'userDataProfile.newWindow',
|
||||
localize('open new window', "New Window"),
|
||||
localize('open new window', "Open New Window with this Profile"),
|
||||
ThemeIcon.asClassName(Codicon.emptyWindow),
|
||||
true,
|
||||
() => this.openWindow(profile)
|
||||
() => this.openWindow(profileElement.profile)
|
||||
));
|
||||
|
||||
const useAsNewWindowProfileAction = disposables.add(new Action(
|
||||
'userDataProfile.useAsNewWindowProfile',
|
||||
localize('use as new window', "Use for New Windows", profile.name),
|
||||
localize('use as new window', "Use for New Windows"),
|
||||
undefined,
|
||||
true,
|
||||
() => profileElement.toggleNewWindowProfile()
|
||||
|
@ -788,9 +788,9 @@ export class UserDataProfilesEditorModel extends EditorModel {
|
|||
[primaryActions, secondaryActions]
|
||||
));
|
||||
|
||||
activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id;
|
||||
activateAction.checked = this.userDataProfileService.currentProfile.id === profileElement.profile.id;
|
||||
disposables.add(this.userDataProfileService.onDidChangeCurrentProfile(() =>
|
||||
activateAction.checked = this.userDataProfileService.currentProfile.id === profile.id));
|
||||
activateAction.checked = this.userDataProfileService.currentProfile.id === profileElement.profile.id));
|
||||
|
||||
useAsNewWindowProfileAction.checked = profileElement.isNewWindowProfile;
|
||||
disposables.add(profileElement.onDidChange(e => {
|
||||
|
|
|
@ -832,7 +832,7 @@ export class SimpleFileDialog implements ISimpleFileDialog {
|
|||
} else if (!statDirname.isDirectory) {
|
||||
this.filePickBox.validationMessage = nls.localize('remoteFileDialog.validateNonexistentDir', 'Please enter a path that exists.');
|
||||
return Promise.resolve(false);
|
||||
} else if (statDirname.readonly || statDirname.locked) {
|
||||
} else if (statDirname.readonly) {
|
||||
this.filePickBox.validationMessage = nls.localize('remoteFileDialog.validateReadonlyFolder', 'This folder cannot be used as a save destination. Please choose another folder');
|
||||
return Promise.resolve(false);
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ export const ICONS = [
|
|||
Codicon.pulse,
|
||||
Codicon.radioTower,
|
||||
Codicon.smiley,
|
||||
Codicon.symbolEvent,
|
||||
Codicon.zap,
|
||||
Codicon.squirrel,
|
||||
Codicon.symbolColor,
|
||||
Codicon.mail,
|
||||
|
|
Loading…
Reference in New Issue
Block a user