#javascript #node.js #visual-studio-code #vscode-extensions
#javascript #node.js #visual-studio-code #vscode-расширения
Вопрос:
Я создал расширение vscode, которое обрабатывает некоторые Rakefile
задачи. Теперь я хочу ограничить, чтобы расширение отображалось в проводнике только тогда, когда пользователь открывает Rakefile
для этого я использую следующую запись в package.json
"contributes": {
"views": {
"explorer": [
{
"id": "rakeView",
"name": "Rakee",
"when": "resourceFilename ='Rakefile'"
}
]
},
"commands": [
{
"command": "rakeView.executeTask",
"title": "Execute",
"icon": "images/icon.png"
}
],
при добавлении следующей строки
"when": "resourceFilename ='Rakefile'"
расширение удалено из представления проводника, когда я его удаляю, я смог увидеть расширение.
Я хочу, чтобы оно отображалось только тогда, когда в проекте есть Rakefile
как я мог это сделать?
Обновить
После попытки ответа ниже он все еще не работает, это весь код:
import * as vscode from "vscode";
import { rakeTaskProvider } from "./rakeCmd";
import { TaskTreeDataProvider } from "./rakeView";
let rakeTaskProvider: vscode.Disposable | undefined;
export function activate(_context: vscode.ExtensionContext): void {
const workspaceRoot = vscode.workspace.rootPath;
const onChangeActiveTextEditor = () => {
let editor = vscode.window.activeTextEditor;
vscode.commands.executeCommand('setContext', 'rakeView:fileIsRake', editor amp;amp; editor.document.languageId === 'rakefile');
};
vscode.window.onDidChangeActiveTextEditor(onChangeActiveTextEditor, null, _context.subscriptions);
onChangeActiveTextEditor();
rakeTaskProvider = vscode.tasks.registerTaskProvider(
rakeTaskProvider.rakeType,
new rakeTaskProvider(workspaceRoot)
);
vscode.window.registerTreeDataProvider(
"rakeView",
new TaskTreeDataProvider(_context)
);
vscode.commands.registerCommand("rakeView.executeTask", function (task) {
console.log(task);
vscode.tasks.executeTask(task).then(
function (value) {
return value;
},
function (e) {
console.error(
"error",
e
);
}
);
});
}
export function deactivate(): void {
if (rakeTaskProvider) {
rakeTaskProvider.dispose();
}
}
package.json
"contributes": {
"views": {
"explorer": [
{
"id": "rakeView",
"name": "Rakke",
"when": "rakeView:fileIsRake"
}
]
},
Комментарии:
1. вы непоследовательны
only when user open a Rakefile
иonly when a project have a Rakefile
Ответ №1:
Вам нужно использовать контекст, когда изменения редактора устанавливают контекстную переменную, чтобы сигнализировать, что текущий файл является файлом Rakefile
В вашей activate
функции
const onChangeActiveTextEditor = () => {
let editor = vscode.window.activeTextEditor;
vscode.commands.executeCommand('setContext', 'myExtenstion:fileIsRake', editor amp;amp; editor.document.languageId === 'rake');
};
vscode.window.onDidChangeActiveTextEditor(onChangeActiveTextEditor, null, context.subscriptions);
onChangeActiveTextEditor();
В package.json
добавьте эту контекстную переменную
"views": {
"explorer": [
{
"id": "rakeView",
"name": "Rakee",
"when": "myExtenstion:fileIsRake"
}
]
},
Комментарии:
1. Спасибо, что это за «myExtension»? это свойство package.json name?
2. @BenoOdr
myExtension
— это просто имя вашего расширения, чтобы найти правильный LanguageID, введите LanguageID в консоль3. спасибо, это не работает, не могли бы вы взглянуть на обновление и посмотреть, чего мне здесь не хватает?
4. @BenoOdr Что такое LanguageID для файлов Rake, используйте a
console.log
в расширении, чтобы узнать5. консоль. войти во что? кроме того, мой код выглядит нормально, а пакет json