如何在VSCode扩展API中程序化评估when子句与判断栏面板状态?
实现VSCode扩展:一键最大化/还原编辑器区域
核心问题解答
VSCode扩展API支持获取侧边栏、活动栏和面板的可见状态,有两种可靠实现方式:
1. 使用官方API直接获取状态(推荐)
VSCode提供vscode.window.state对象,可直接读取布局组件的可见性,这是官方支持的稳定API:
// 获取当前布局状态 const layoutState = vscode.window.state; // 提取各组件状态 const isSideBarVisible = layoutState.sideBarVisible; const isActivityBarVisible = layoutState.activityBarVisible; const isPanelVisible = layoutState.panelVisible; console.log(`侧边栏: ${isSideBarVisible ? '显示' : '隐藏'}`); console.log(`活动栏: ${isActivityBarVisible ? '显示' : '隐藏'}`); console.log(`底部面板: ${isPanelVisible ? '显示' : '隐藏'}`);
2. 通过内部命令获取上下文键值
如果需要获取sideBarVisible这类用于when子句的系统上下文键,可以使用VSCode内部命令getContext(虽未在官方文档公开,但广泛应用且稳定):
// 封装获取上下文键的工具函数 async function getContextKey(key: string): Promise<boolean | undefined> { try { return await vscode.commands.executeCommand('getContext', key); } catch (err) { console.error(`获取上下文键 ${key} 失败:`, err); return undefined; } } // 使用示例 const sideBarVisible = await getContextKey('sideBarVisible'); const panelVisible = await getContextKey('panelVisible'); const activityBarVisible = await getContextKey('activityBarVisible');
完整实现示例
注册隐藏/恢复命令
import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { // 隐藏所有侧边栏和面板的命令 const hideCommand = vscode.commands.registerCommand('extension.maximizeEditor', async () => { // 记录当前状态,用于后续恢复 const currentState = { sideBar: vscode.window.state.sideBarVisible, activityBar: vscode.window.state.activityBarVisible, panel: vscode.window.state.panelVisible }; // 将状态存储到扩展上下文 await vscode.commands.executeCommand('setContext', 'extension.previousLayoutState', currentState); // 标记当前为最大化状态,用于快捷键切换 await vscode.commands.executeCommand('setContext', 'extension.isEditorMaximized', true); // 执行隐藏操作 if (currentState.sideBar) await vscode.commands.executeCommand('workbench.action.toggleSidebarVisibility'); if (currentState.activityBar) await vscode.commands.executeCommand('workbench.action.toggleActivityBarVisibility'); if (currentState.panel) await vscode.commands.executeCommand('workbench.action.togglePanel'); }); // 恢复布局的命令 const restoreCommand = vscode.commands.registerCommand('extension.restoreEditor', async () => { // 获取之前存储的状态 const previousState = await vscode.commands.executeCommand('getContext', 'extension.previousLayoutState') as { sideBar: boolean; activityBar: boolean; panel: boolean; }; if (!previousState) return; const currentState = vscode.window.state; // 对比状态,执行切换 if (previousState.sideBar !== currentState.sideBarVisible) { await vscode.commands.executeCommand('workbench.action.toggleSidebarVisibility'); } if (previousState.activityBar !== currentState.activityBarVisible) { await vscode.commands.executeCommand('workbench.action.toggleActivityBarVisibility'); } if (previousState.panel !== currentState.panelVisible) { await vscode.commands.executeCommand('workbench.action.togglePanel'); } // 清除状态标记 await vscode.commands.executeCommand('setContext', 'extension.previousLayoutState', undefined); await vscode.commands.executeCommand('setContext', 'extension.isEditorMaximized', false); }); context.subscriptions.push(hideCommand, restoreCommand); }
配置快捷键切换
在package.json中添加贡献点,实现同一快捷键根据当前状态触发不同命令:
{ "contributes": { "commands": [ { "command": "extension.maximizeEditor", "title": "Maximize Editor (Hide Sidebars & Panel)" }, { "command": "extension.restoreEditor", "title": "Restore Editor Layout" } ], "keybindings": [ { "command": "extension.maximizeEditor", "key": "ctrl+shift+m", "when": "!extension.isEditorMaximized" }, { "command": "extension.restoreEditor", "key": "ctrl+shift+m", "when": "extension.isEditorMaximized" } ] } }
内容的提问来源于stack exchange,提问作者pkubik
相关产品推荐
相关产品推荐

