VSCode files.associations

Ber*_*ler 8 visual-studio-code

.txt在项目的子文件夹中有一些包含SQL代码的文件.我想要SQL语法高亮,所以我把它添加到我的工作区 文件夹设置:

{
    "files.associations": {
        "**/somefolder/*.txt": "sql" 
    }
}
Run Code Online (Sandbox Code Playgroud)

当文件夹名称前面有两颗星时,这种方法有效.但somefolder实际上是我项目根目录下的文件夹.

为什么我不能写像somefolder/**/*.txt

小智 13

似乎这个新版本的 VSCode 要求您**在开始时使用 ,而不管:

{
    "files.associations": {
        "**/somefolder/**/*.txt": "sql" 
    }
}
Run Code Online (Sandbox Code Playgroud)

那应该工作


sub*_*per 6

上下文:尝试回答@gremo的额外赏金问题:

长话短说

这是由于full pathvsfilename基于 的存在的匹配行为/VSCode文档中也隐晦地提到了同样的内容。请继续阅读以了解详细信息。

细节:

根据@gremo的要求,引用以下信誉良好的来源:

Visual Studio Code 中的语言支持

请注意,该模式是一个全局模式,如果它包含 /,则将在文件的完整路径上匹配,否则将在文件名上匹配。

仔细阅读,您会看到这个词full path of the filefile name脱颖而出!

即从上面我们可以推断,根据它的存在将决定vs/的匹配模式/行为!full path matchpartial/filename match

relative当我们看到路径还不允许时,这更有意义,正如@Bob_在他的答案中发布的问题 #12805 允许工作区相对 files.associations 设置中提到的。

希望以上内容能够阐明:
  1. 为什么模式somefolder/*.txt不匹配?

    • 因为有一个/in 模式,这将进行full path匹配

    • 在我们的例子中,加载文件的完整路径将是:c:\scratch\VsCodePatternTest\somefolder\foo.txtc:\scratch\VsCodePatternTest\foo.txt

    • 所以我们本质上是试图将上面的full path模式匹配:somefolder/*.txt

    • 结果:都不匹配!

    • 注意:从技术上讲,这个路径永远不会匹配任何东西,因为Windows/Linux/Mac你不能有像上面这样的绝对路径..它需要以某种方式扎根:

              E.g. on Windows:
                 c:/somefolder  (or use `\\` for back slashes on windows)
              on Linux/Mac:
                 /somefolder
      
      Run Code Online (Sandbox Code Playgroud)
  2. 为什么要进行模式**/somefolder/*.txt匹配?

    • 现在再次因为有一个/in 模式,这将进行full path匹配

    • 再次像上面一样,加载文件的完整路径将是:c:\scratch\VsCodePatternTest\somefolder\foo.txtc:\scratch\VsCodePatternTest\foo.txt

    • 所以我们本质上是试图将上面的full path模式匹配:**/somefolder/*.txt

    • 结果:只有一个文件匹配!

  3. 额外奖励:为什么要进行模式foo.txt匹配?

    • 现在,由于模式中没有 ,这将进行匹配/filename

    • 再次像上面一样,加载文件的完整路径将是:c:\scratch\VsCodePatternTest\somefolder\foo.txtc:\scratch\VsCodePatternTest\foo.txt

    • 所以我们本质上是在尝试匹配上面的filenameiefoo.txtfoo.txt模式:foo.txt

    • 结果:两个文件匹配!

测试上述情况:

希望这能解决问题!