我正在为 VS Code 做一个扩展。任务:在使用某种语言(例如 SQL)时将元素添加到状态栏。对于其他语言,不需要显示该元素。创建了一个命令:
envStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 80);
envStatusBarItem.command = aseChangeEnvironmentCommand;
context.subscriptions.push(envStatusBarItem);
设置监听器
context.subscriptions.push(vscode.window.onDidChangeActiveTextEditor(updateEnvStatusBarItemFn));
此外,在package.json添加到activationEvents条件"onLanguage:sql"。
我显示和隐藏状态栏元素如下:
const updateEnvStatusBarItemFn = () => {
const editor = vscode.window.activeTextEditor;
if (editor) {
if (editor.document.languageId === 'sql') {
let aseCurrentServer = context.globalState.get('aseCurrentServer', '');
envStatusBarItem.text = `ASE[${aseCurrentServer}]`;
envStatusBarItem.show();
}
else {
envStatusBarItem.hide();
}
}
else {
envStatusBarItem.hide();
}
};
问题是在编辑器中将语言更改为 SQL 或打开 *.sql 文件时(根据 package.json 中的条件)激活了扩展。显示状态栏元素,但随后扩展被认为是活动的,并且显示/隐藏状态栏元素的功能仅在onDidChangeActiveTextEditor切换选项卡时在程序安装的处理程序上起作用。我找不到与更改语言相关的侦听器,我可以在其上挂起我的处理程序。有没有这样的方法,还是我需要写一个功能请求?
VSCode 的开发者给出了答案:当文档的语言发生变化时,会
onDidCloseTextDocument调用和 事件onDidOpenTextDocument。VSCode 代码中的描述: 答案