第一个问题:
你有
"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 与\bundle 或/bundle 或\concat 或/concat 中的结尾(在反斜杠或正斜杠之前有很多转义)。 p>
现在,到达您的最终目的地 - 过滤菜单以不显示特定文件夹和文件的命令。
我认为没有办法否定resourceFilename in ext.list“运算符”。我好像想起了一个github issue,但是现在找不到了。
但是还有另一种方法,因为我们可以使用上面when 子句中看到的正则表达式。但它必须有点棘手,因为我们试图排除某些文件夹和文件。试试这个:
"menus": {
"explorer/context": [
{
"when": "explorerResourceIsFolder && resourcePath =~ /.*?(?<!(\\\\|\\\/)(bundle|concat))$/ || !explorerResourceIsFolder && resourceDirname =~ /.*?(?<!(\\\\|\\\/)(bundle|concat))$/",
"command": "ext.samplecommand"
}
]
},
explorerResourceIsFolder && resourcePath =~ /.*?(?<!(\\\\|\\\/)(bundle|concat))$
当所选资源为文件夹时,检查其resourcePath,这将是其以文件夹名称结尾的完整文件路径。
所以resourcePath =~ /.*?(?<!(\\\\|\\\/)(bundle|concat))$ 使用否定的lookbehind 来匹配不 以名为bundle 或concat 在此示例中的文件夹结尾的文件夹路径(您的a 和b) .
!explorerResourceIsFolder && resourceDirname =~ /.*?(?<!(\\\\|\\\/)(bundle|concat))$/
当所选资源是文件而不是文件夹时,检查其resourceDirname,这将是其以文件夹名称结尾的完整文件路径。
因此,像上面一样,它使用否定的lookbehind 仅匹配带有dirnames 而不是bundle 或concat 的文件。
因此,总而言之,由于不能否定 resourceFilename in ext.list 类型的构造,因此您必须使用 when 子句的 key =~ value 类型,并确保将其与正确的资源名称进行比较。并通过使用某种正则表达式否定环顾来“否定”它。
要弄清楚这一点,Developer: Inspect Context Keys 命令是非常宝贵的。它允许您查看资源管理器文件夹和文件可用的上下文键以及这些键的值。这就是我发现resourcePath 最适合文件夹和resourceDirname 最适合文件的原因——因为在这两种情况下,完整路径都以文件夹名称结尾。
见Inspect Context Keys utility documentation。