创建Visual Studio主题特定语法突出显示

Sha*_*ron 9 syntax-highlighting vspackage visual-studio visual-studio-extensions visual-studio-2012

我想在Visual Studio 2012(及更高版本)创建一个支持不同主题(黑暗,浅色,蓝色)的语法荧光笔.

Visual Studio的编辑器分类器项目模板说明了如何使用环境创建自己的颜色Microsoft.VisualStudio.Text.Classification.ClassificationFormatDefinition.它工作正常......

...直到您意识到Visual Studio 2012(及更高版本)中存在不同的主题,并且您并不真正支持它们.在黑暗的主题环境中,浅色主题上漂亮的深蓝色标识符变得难以辨认.

根据我的理解,如果您在给定主题(例如:Light)中的工具/选项/字体和颜色中更改ClassificationFormatDefinition,它将不会影响不同主题中的相同ClassificationFormatDefinition(例如:Dark).颜色似乎在不同的主题上是独立的.

那很好.但是我如何实现定义在所有主题中具有相同名称的相同ClassificationFormatDefinition(例如:MyKeywords),但为它们提供不同的颜色?就像Visual Studio自己的"标识符"一样,它在Light主题上是默认的黑色,在黑色主题上是默认的.

我知道这个Microsoft.VisualStudio.PlatformUI.VSColorTheme.ThemeChanged事件可以让我在更改颜色主题时收到通知.我是否必须使用它并以某种方式获取我现有的ClassificationFormatDefinition并根据新主题为它们分配新颜色?但这也提出了一个问题:这些修改后的颜色是否会持久保存到环境中,即如果我重新启动Visual Studio,下次在所有不同的主题中我的更改是否会存在.

我没有找到任何属性来说明ClassificationFormatDefinition支持哪个主题,也没有找到关于这个主题的非常有用的文章.

任何帮助赞赏.

Sha*_*ron 2

好的,这是我找到的解决方法。它远非完美,但已经尽力了。

诀窍是在定义自己的分类类型时使用另一个基本定义。这将为不同的主题使用默认颜色。重要的是,您不能定义自己的颜色,MyKeywordsFormatDefinition因为这会在主题之间切换时禁用默认行为。因此,尝试找到与您的颜色相匹配的基本定义。在此处查找预定义的分类类型:Microsoft.VisualStudio.Language.StandardClassification.PredefinedClassificationTypeNames

internal static class Classifications
{
    // ...
    public const string MyKeyword = "MyKeyword";
    // ...
}

[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = Classifications.MyKeyword)]
[Name("MyKeywords")]
[DisplayName("My Keywords")]
[UserVisible(true)]
internal sealed class MyKeywordsFormatDefinition: ClassificationFormatDefinition
{
    // Don't set the color here, as it will disable the default color supporting themes
}

[Export(typeof(ClassificationTypeDefinition))]
[Name(Classifications.MyKeyword)]
[BaseDefinition(PredefinedClassificationTypeNames.Keyword)]
internal static ClassificationTypeDefinition MyKeywordsTypeDefinition;
Run Code Online (Sandbox Code Playgroud)

我希望它对你们中的一些人有用。当您实际上可以设置自己的颜色而无需重复使用现有的颜色定义时,甚至可能有助于完善正确的解决方案。

  • 仅当您想重复使用现有的“基本”颜色时,这才有效。如果您想支持 Visual Studio Shell(向非付费用户提供语言支持),您将无法引用诸如“用户类型(接口)”之类的项目,因为这些项目是由其他语言服务引入的不包含在 Shell 版本中。 (3认同)