When语句从上下文菜单中显示扩展命令中排除指定的文件夹和文件 [英] when statement to exclude specified folders and files from showing an extension command in a context menu
问题描述
/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/*.*
,但没有找到任何有效的选项。
好的,接下来,我还是要排除该命令,当我尝试时:
{
"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
将解析为a
或b
。但它对文件没有帮助,因为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)$
这将检查resourceDirname
与undle
或/bundle
或concat
或/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))$
使用负向查找来匹配不是以bundle
或concat
结束的文件夹路径,在本例中(您的a
和b
)。
!explorerResourceIsFolder && resourceDirname =~ /.*?(?<!(\\|\/)(bundle|concat))$/
如果所选资源是文件而不是文件夹,请检查其resourceDirname
,这将是以文件夹名结尾的完整文件路径。
如上所示,它使用负向回溯来仅匹配bundle
或concat
以外的dirnames
文件。
总而言之,由于
resourceFilename in ext.list
类型的构造不能被否定,因此您必须使用key =~ value
类型的when
子句,并确保将其与正确的资源名称进行比较。并通过使用某种正则表达式负值查找来对其求反。
要解决此问题,Developer: Inspect Context Keys
命令是无价的。它允许您查看哪些上下文键可用于资源管理器文件夹和文件以及这些键的值。这就是我发现resourcePath
最适合文件夹,resourceDirname
最适合文件的原因--因为在这两种情况下,完整路径都以文件夹名称结尾。
请参阅Inspect Context Keys utility documentation。
这篇关于When语句从上下文菜单中显示扩展命令中排除指定的文件夹和文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!