visual-studio - 创建 Visual Studio 主题特定的语法高亮

标签 visual-studio visual-studio-2012 syntax-highlighting visual-studio-extensions vspackage

我要在 Visual Studio 2012 中创建语法荧光笔 (及以上)支持不同主题 (深色、浅色、蓝色)。

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

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

据我了解,如果您在给定主题(例如:浅色)中的工具/选项/字体和颜色中更改分类格式定义,它不会影响不同主题(例如:深色)中的相同分类格式定义。不同主题的颜色似乎是独立的。

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

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

我还没有找到任何可以说明 ClassificationFormatDefinition 支持哪个主题的属性,也没有找到关于该主题的很多有用的文章。

任何帮助表示赞赏。

最佳答案

好的,这是我找到的解决方法。它远非完美,但已尽其所能。

诀窍是在定义自己的分类类型时使用另一个基本定义。这将为不同的主题使用它们的默认颜色。重要的是你不能在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;

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

关于visual-studio - 创建 Visual Studio 主题特定的语法高亮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24404473/

相关文章:

c++ - MSVC C/C++ 编译器未定义行为警告

visual-studio-2012 - InstallShield LE(使用 Visual Studio 2012)完全无法检测依赖项

c++ - 如何将模板类限制为某些内置类型?

syntax-highlighting - 如何在 Aptana 中突出显示 Blade 语法

Vim:从任意行重新启动语法突出显示

c# - 在这种特定且非常简单的情况下,为什么 Debug 不同于 Release?

c++ - 使用 std::map 查找数据中的重复项及其性能问题。我可以预分配吗?

Windows Kit 8.0 和 Visual Studio 2012 - 它们是一起发货的吗?

configuration - Vim 配置行号着色

c# - Dll 由未知公司签名?