Visual Studio 扩展名:从文件名或 ProjectItem 获取语言/文件类型

Visual Studio extension: get language / file type from file name or ProjectItem

我正在编写一个扩展来提供基本的项目统计信息(例如代码行数)。遍历 Solution 树并找到与文件对应的 ProjectItem 就够简单了。

Document结构有KindLanguage属性,但后者被标记为仅供内部使用,两者都需要先在编辑器中打开文件。

所以...有没有办法:

  1. 查看哪些文件 Visual Studio 将归类为文本文件。
  2. 查看 Visual Studio 与给定文件名/文件扩展名关联的语言。

没有打开文件?

我写过这样的统计数据(虽然只针对 C# 和 VB.NET),这两个问题对于所有项目类型/文件类型/语言来说都非常棘手。首先,如果需要,您可以使用 ProjectItem.Open(view) 方法从 EnvDTE.ProjectItem 打开 EnvDTE.Document / EnvDTE.TextDocument,其中 returns EnvDTE.Window。这不会使 window 可见,默认情况下是不可见的,您需要调用 Window.Visible = true 才能使其可见。完成后,用 Window.Close 关闭(不可见的)window,除非它已经打开(您可以知道先调用 ProjectItem.get_IsOpen(view) 然后再相应地关闭或不关闭)。

现在:

  • 很难判断一个文件是不是文本文件,因为VS支持的项目很多,每个项目类型都可以判断其files/extensions是否是文本文件。我发现的最佳方法是将所有文件都视为文本文件,除非已知扩展名不是文本文件(.jpg 等)。另外,请注意并非所有文本文件都是代码文件(例如:.txt 文件)。对于某些功能,例如查找文本功能,您可能对文本文件感兴趣,但对于统计功能,您可能对代码文件感兴趣,而不仅仅是文本文件。

  • 您可以使用 EnvDTE.ProjectItem.FileCodeModel.Language(和 EnvDTE.Project.CodeModel.Language)了解文件语言的 GUID。 las,有些项目/文件有语言但不提供代码模型,因此您可能需要使用已知的扩展来映射到语言。

一些有用的语言指南:

     const string LANGUAGE_CSHARP = "{B5E9BD34-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_IDL = "{B5E9BD35-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_MANAGED_C = "{B5E9BD36-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_VBNET = "{B5E9BD33-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_VISUAL_C = "{B5E9BD32-6D3E-4B5D-925E-8A43B79820B4}";
     const string LANGUAGE_PYTHON = "{888888A0-9F3D-457C-B088-3A5042F75D52}";
     const string LANGUAGE_FSHARP = "{F2A71F9B-5D33-465A-A702-920D77279786}";
     const string LANGUAGE_R = "{DA7A21FA-8162-4350-AD77-A8D1B671F3ED}";

请注意,由于 VS 如此可扩展,因此没有语言枚举。新语言提供新 guid。