Я делаю расширение для 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
добавлено условие "onLanguage: sql"
в activationEvents
.
Я показываю и скрываю элемент строки состояния следующим образом:
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
при переключении вкладок. Я не мог найти слушателя, связанного с изменением языка, на котором я мог бы повесить мой обработчик. Есть ли такой способ, или я должен написать функцию-запрос?