When语句从上下文菜单中显示扩展命令中排除指定的文件夹和文件 [英] when statement to exclude specified folders and files from showing an extension command in a context menu

查看:75
本文介绍了When语句从上下文菜单中显示扩展命令中排除指定的文件夹和文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的VS代码扩展中,我有一些命令希望在资源管理器视图中可用,并希望它们的可用性基于所选择的内容。假设我在VS Code中打开一个文件夹,该文件夹包含以下内容:

/a
/a/1.txt
/a/2.txt

/b
/b/3.txt
/b/4.txt

/c
/c/5.txt
/c/6.txt

我希望在选择文件夹或其中的任何内容(而不是a或b)时显示命令。

另外,我希望逻辑排除特定文件夹(及其内容),而不是包括特定文件夹(例如,我希望该命令对除a或b&q;之外的所有都可用)

在我的扩展的activate()函数中,我有:

  vscode.commands.executeCommand(
    'setContext',
    'ext.list',
    [
      'a',
      'b'
    ]
  );

在我的package.json中,我有:

{
  "command": "samplecommand",
  "when": "resourceFilename in ext.list"
}

当我运行此命令时,我发现当我选择了文件夹a或b时,该命令可用,但当我选择了其中的任何项时(如a/1.txt),该命令就不可用了。我尝试使用a/*a/.*a/*.*,但没有找到任何有效的选项。

因此,当在";中使用";resource Filename时,它是否支持正则表达式?或者它只执行精确的字符串匹配?如果选择了该文件夹或该文件夹中的某个项目,如何才能获得肯定匹配?

好的,接下来,我还是要排除该命令,当我尝试时:

{
  "command": "samplecommand",
  "when": "!(resourceFilename in ext.list)"
}

...或:

{
  "command": "samplecommand",
  "when": "resourceFilename !in ext.list"
}

...该命令不会显示为a、b或c。是否可以测试文件名是否在列表中?这似乎总是计算为False。

那么,TL;DR,我想在资源管理器视图中筛选命令,然后不显示特定文件夹和该文件夹中的项目。这可能吗?

推荐答案

第一个问题:

您拥有

"contributes": {
   "menus": {
     "explorer/context": [
       {
         "command": "ext.samplecommand",
         "when": "resourceFilename in ext.list"
       }
     ]
   }
}

'ext.list', [ 'a', 'b' ]

当我运行此命令时,我发现命令在以下情况下可用 选择了文件夹a或b,但不是当我在其中有任何项目时 它选择了(如a/1.txt)。我尝试使用a/*a/.*a/*.*,但我 我找不到任何有用的东西。

但是resourceFilename解析为文件夹的a和文件的myFile.js。因此,"resourceFilename in ext.list"对文件夹的作用与您预期的一样,因为如果选择了文件夹,resourceFilename将解析为ab。但它对文件没有帮助,因为resourceFilename不解析为文件夹名,而是解析为文件名。

要同时显示文件夹及其包含的文件的菜单项,您可以执行以下操作:

"menus": {
  "explorer/context": [
    {
      "when": "resourceFilename in ext.list || !explorerResourceIsFolder && resourceDirname =~ /(\/|\\)(bundle|concat)$/",
      "command": "ext.samplecommand"
    }
  ]
}

其中(bundle|concat)表示dirname要包含的文件

回答了when子句中支持正则表达式的问题。是,请参见key-value when clause operator

WHEN子句有一个键-值对匹配运算符。这个 表达式key =~ value将右侧视为常规 要与左侧匹配的表达式。

上述用法resourceDirname =~ /(\/|\\)(bundle|concat)$

这将检查resourceDirnameundle/bundleconcat/concat中的结尾(在反斜杠或正斜杠之前有许多转义)。


现在,要到达最终目的地-将菜单筛选为不显示特定文件夹和文件的命令。

我不认为有办法否定resourceFilename in ext.list";运算符。我似乎想起了GitHub的一个问题,但现在找不到了。

但还有另一种方法,因为我们可以使用正则表达式,就像我们在when子句中看到的那样。但这肯定会更棘手一些,因为我们正在尝试排除某些文件夹和文件。试试这个:

"menus": {
  "explorer/context": [
    {
      "when": "explorerResourceIsFolder && resourcePath =~ /.*?(?<!(\\|\/)(bundle|concat))$/ || !explorerResourceIsFolder && resourceDirname =~ /.*?(?<!(\\|\/)(bundle|concat))$/",
      "command": "ext.samplecommand"
    }
  ]
},

  • explorerResourceIsFolder && resourcePath =~ /.*?(?<!(\\|\/)(bundle|concat))$

如果所选资源是文件夹,请检查其resourcePath,这将是以文件夹名称结尾的完整文件路径。

因此resourcePath =~ /.*?(?<!(\\|\/)(bundle|concat))$使用负向查找来匹配不是bundleconcat结束的文件夹路径,在本例中(您的ab)。

  • !explorerResourceIsFolder && resourceDirname =~ /.*?(?<!(\\|\/)(bundle|concat))$/

如果所选资源是文件而不是文件夹,请检查其resourceDirname,这将是以文件夹名结尾的完整文件路径。

如上所示,它使用负向回溯来仅匹配bundleconcat以外的dirnames文件。


总而言之,由于resourceFilename in ext.list类型的构造不能被否定,因此您必须使用key =~ value类型的when子句,并确保将其与正确的资源名称进行比较。并通过使用某种正则表达式负值查找来对其求反。


要解决此问题,Developer: Inspect Context Keys命令是无价的。它允许您查看哪些上下文键可用于资源管理器文件夹和文件以及这些键的值。这就是我发现resourcePath最适合文件夹,resourceDirname最适合文件的原因--因为在这两种情况下,完整路径都以文件夹名称结尾。

请参阅Inspect Context Keys utility documentation

这篇关于When语句从上下文菜单中显示扩展命令中排除指定的文件夹和文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆