diff --git a/editors/code/package.json b/editors/code/package.json index df97efaae7..fc3bc73b70 100644 --- a/editors/code/package.json +++ b/editors/code/package.json @@ -426,40 +426,55 @@ "default": "openLogs", "markdownDescription": "Action to run when clicking the extension status bar item." }, - "rust-analyzer.statusBar.documentSelector": { - "type": [ - "array", - "null" - ], - "items": { - "type": "object", - "properties": { - "language": { - "type": [ - "string", - "null" - ] - }, - "pattern": { - "type": [ - "string", - "null" - ] + "rust-analyzer.statusBar.showStatusBar": { + "markdownDescription": "When to show the extension status bar.\n\n`\"always\"` Always show the status bar.\n\n`\"never\"` Never show the status bar.\n\n`{ documentSelector: [] }` Show the status bar if the open file matches any of the given document selectors.\n\nSee [VS Code -- DocumentSelector](https://code.visualstudio.com/api/references/document-selector) for more information.", + "anyOf": [ + { + "type": "string", + "enum": [ + "always", + "never" + ] + }, + { + "type": "object", + "properties": { + "documentSelector": { + "type": "array", + "items": { + "type": "object", + "properties": { + "language": { + "type": "string" + }, + "notebookType": { + "type": "string" + }, + "scheme": { + "type": "string" + }, + "pattern": { + "type": "string" + } + } + } + } } } - }, - "default": [ - { - "language": "rust" - }, - { - "pattern": "**/Cargo.toml" - }, - { - "pattern": "**/Cargo.lock" - } ], - "markdownDescription": "Determines when to show the extension status bar item based on the currently open file. Use `{ \"pattern\": \"**\" }` to always show. Use `null` to never show." + "default": { + "documentSelector": [ + { + "language": "rust" + }, + { + "pattern": "**/Cargo.toml" + }, + { + "pattern": "**/Cargo.lock" + } + ] + } } } }, diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts index f7ef80df2b..a97d4beab5 100644 --- a/editors/code/src/config.ts +++ b/editors/code/src/config.ts @@ -13,6 +13,13 @@ export type RunnableEnvCfgItem = { }; export type RunnableEnvCfg = Record | RunnableEnvCfgItem[]; +type ShowStatusBar = + | "always" + | "never" + | { + documentSelector: vscode.DocumentSelector; + }; + export class Config { readonly extensionId = "rust-lang.rust-analyzer"; configureLang: vscode.Disposable | undefined; @@ -348,8 +355,8 @@ export class Config { return this.get("statusBar.clickAction"); } - get statusBarDocumentSelector() { - return this.get("statusBar.documentSelector"); + get statusBarShowStatusBar() { + return this.get("statusBar.showStatusBar"); } get initializeStopped() { diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index 459754b1d1..37a54abf71 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts @@ -480,14 +480,19 @@ export class Ctx implements RustAnalyzerExtensionApi { } private updateStatusBarVisibility(editor: vscode.TextEditor | undefined) { - const documentSelector = this.config.statusBarDocumentSelector; - if (documentSelector != null) { + const showStatusBar = this.config.statusBarShowStatusBar; + if (showStatusBar == null || showStatusBar === "never") { + this.statusBar.hide(); + } else if (showStatusBar === "always") { + this.statusBar.show(); + } else { + const documentSelector = showStatusBar.documentSelector; if (editor != null && vscode.languages.match(documentSelector, editor.document) > 0) { this.statusBar.show(); - return; + } else { + this.statusBar.hide(); } } - this.statusBar.hide(); } pushExtCleanup(d: Disposable) {