【问题标题】:Vscode Ext display extension only when project have some fileVscode Ext仅在项目有文件时显示扩展名
【发布时间】:2021-03-01 14:53:40
【问题描述】:

我创建了一个处理一些 Rakefile 任务的 vscode 扩展。 现在我想限制扩展名仅在用户使用时才会显示在资源管理器中 打开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 时显示,我该怎么做?

https://github.com/microsoft/vscode-extension-samples/tree/1aae138e311fb87cc3ed2782be287f5d2f78e327/task-provider-sample

更新

尝试下面的答案后仍然不起作用,这是全部代码:

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 && 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"
        }
      ]
    },

【问题讨论】:

  • 你的only when user open a Rakefileonly when a project have a Rakefile不一致

标签: javascript node.js visual-studio-code vscode-extensions


【解决方案1】:

你需要使用上下文,当编辑器改变时设置一个上下文变量来表示当前文件是一个 Rakefile

在您的 activate 函数中

  const onChangeActiveTextEditor = () => {
    let editor = vscode.window.activeTextEditor;
    vscode.commands.executeCommand('setContext', 'myExtenstion:fileIsRake', editor && editor.document.languageId === 'rake');
  };
  vscode.window.onDidChangeActiveTextEditor(onChangeActiveTextEditor, null, context.subscriptions);
  onChangeActiveTextEditor();

package.json 中添加这个上下文变量

    "views": {
      "explorer": [
        {
          "id": "rakeView",
          "name": "Rakee",
          "when": "myExtenstion:fileIsRake"
        }
      ]
    },

【讨论】:

  • 谢谢,“myExtension”是什么?是 package.json 名称属性吗?
  • @BenoOdr myExtension 只是您的扩展名,找到正确的languageId 将languageId 记录到控制台
  • 谢谢,它不工作,你能看看更新,看看我在这里缺少什么?
  • @BenoOdr Rake 文件的语言 ID 是什么,使用扩展名中的console.log 查找
  • console.log 到什么?另外我的代码看起来不错,包 json
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多