Partager via


Syntaxe Colorizing (managed de package)

La colorisation de syntaxe est une fonctionnalité qui provoque des éléments individuels d'un langage de programmation à afficher dans un fichier source dans différents styles et couleur. Pour prendre en charge cette fonctionnalité, vous devez fournir un analyseur ou un scanner qui peuvent identifier les types des éléments ou de entités lexicales dans le fichier. De nombreux langages respectent les mots clés, les séparateurs (tels que les parenthèses ou des accolades), et des commentaires par colorizing les différentes façons.

Implémentation

Pour prendre en charge la colorisation, managed package (MPF) inclut la classe d' Colorizer , qui implémente l'interface d' IVsColorizer . Cette classe interagit avec IScanner pour déterminer le jeton de couleurs et. Pour plus d'informations sur les antivirus, consultez Analyseur de service de langage et scanner (managed de package). La classe d' Colorizer marque chaque caractère du jeton avec les informations sur la couleur et retourne cette information à l'éditeur affiche le fichier source.

Les informations sur la couleur retournées à l'éditeur sont un index dans une liste d'éléments qui autorisent la modification de la couleur. Chaque élément coloriable spécifie une valeur de couleur et un ensemble d'attributs de police, tels que gras ou barré. L'éditeur fournit un ensemble d'éléments qui autorisent la modification de la couleur par défaut que votre service de langage peut utiliser. Il vous suffit d'affecter consiste à spécifier l'index de couleurs approprié pour chaque type de jeton. Toutefois, vous pouvez fournir un ensemble d'éléments qui autorisent la modification de la couleur personnalisés et des index que vous fournissez pour les jetons, et référencez votre propre liste d'éléments qui autorisent la modification de la couleur au lieu de la liste par défaut. Vous devez également définir l'entrée du Registre d' RequestStockColors et 0 (ou ne spécifiez pas l'entrée d' RequestStockColors du tout) pour prendre en charge des couleurs personnalisées. vous pouvez définir cette entrée du Registre avec un paramètre nommé à l'attribut défini par l'utilisateur d' ProvideLanguageServiceAttribute . Pour plus d'informations sur l'inscription un service de langage et définir ses options, consultez Enregistrement d'un service de langage (managed de package).

Éléments qui autorisent la modification de la couleur personnalisés

Pour fournir vos propres éléments qui autorisent la modification de la couleur personnalisés, vous devez substituer GetItemCount et la méthode d' GetColorableItem sur la classe d' LanguageService . La première méthode retourne le nombre d'éléments personnalisés qui autorisent la modification de la couleur que vos service prend en charge du langage et le deuxième obtient à l'élément coloriable personnalisé par index. Vous créez la liste par défaut d'éléments qui autorisent la modification de la couleur personnalisés. Dans le constructeur de votre service de langage, vous devez faire est de fournir chaque élément coloriable avec un nom. Visual Studio traite automatiquement le cas où l'utilisateur sélectionne un autre ensemble d'éléments qui autorisent la modification de la couleur. Ce nom est ce qui s'affiche dans la page de propriétés de Polices et couleurs dans la boîte de dialogue d' Options (disponible dans le menu de Visual Studio Outils ) et ce nom détermine les couleurs un utilisateur a substitué. Les choix de l'utilisateur sont stockés dans un cache dans le Registre et accessibles par le nom de couleur. La page de propriétés de Polices et couleurs répertorie tous les noms de couleurs dans l'ordre alphabétique, vous pouvez regrouper vos couleurs personnalisées en faisant précéder chaque nom de couleur avec le nom de langue ; par exemple, « commentaire de TestLanguage- » et « mot clé de TestLanguage- ». Ou vous pouvez regrouper vos éléments qui autorisent la modification de la couleur par le type, « commentez (TestLanguage) » et « mot clé (TestLanguage) ». le regroupement par le nom de langue est préféré.

Avertissement

Il est fortement recommandé d'inclure le nom de langue dans le nom coloriable d'élément pour éviter des collisions avec des noms qui autorisent la modification de la couleur d'élément existants.

Notes

Si vous modifiez le nom d'une de vos couleurs pendant le développement, vous devez réinitialiser le cache que Visual Studio créé la première fois les couleurs ont fait l'objet d'un accès.Vous pouvez effectuer cette opération en exécutant la commande de réinitialisez la ruche expérimentale dans le menu de programme du kit de développement Visual Studio.

Notez que le premier élément de la liste d'éléments qui autorisent la modification de la couleur n'est jamais référencée. Visual Studio fournit toujours les couleurs et les attributs du texte par défaut de cet élément. La façon la plus facile de traiter celui-ci est de fournir un élément coloriable d'espace réservé comme premier élément.

Éléments qui autorisent la modification de la couleur de 65536 couleurs

Les éléments qui autorisent la modification de la couleur peuvent également prendre en charge 24 bits ou des valeurs de 65536 couleurs via IVsHiColorItem interface. la classe de MPF ColorableItem prend en charge l'interface d' IVsHiColorItem et les couleurs 24 bits sont spécifiées dans le constructeur avec les couleurs normales. Consultez la classe d' ColorableItem pour plus de détails. L'exemple suivant montre comment définir les couleurs 24 bits pour les mots clés et des commentaires. Les couleurs 24 bits sont utilisées lorsque la couleur 24 bits est prise en charge sur le Bureau de l'utilisateur ; sinon, les couleurs normales de texte sont utilisées.

N'oubliez pas, ceux-ci sont les couleurs par défaut pour votre langage ; l'utilisateur peut modifier ces couleurs à celui qu'ils souhaitent.

Exemple

Cet exemple illustre une manière de déclarer et remplir un tableau d'éléments qui autorisent la modification de la couleur personnalisés à l'aide de la classe d' ColorableItem . Cet exemple définit le mot clé et le commentaire couleurs à l'aide de couleurs 24 bits.

using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;

namespace TestLanguagePackage
{
    public class TestLanguageService : LanguageService
    {
        private ColorableItem[] m_colorableItems;

        TestLanguageService() : base()
        {
            m_colorableItems = new ColorableItem[] {
                new ColorableItem("TestLanguage – Text",
                                  "Text",
                                  COLORINDEX.CI_SYSPLAINTEXT_FG,
                                  COLORINDEX.CI_SYSPLAINTEXT_BK,
                                  System.Drawing.Color.Empty,
                                  System.Drawing.Color.Empty,
                                  FONTFLAGS.FF_DEFAULT),
                new ColorableItem("TestLanguage – Keyword",
                                  "Keyword",
                                  COLORINDEX.CI_MAROON,
                                  COLORINDEX.CI_SYSPLAINTEXT_BK,
                                  System.Drawing.Color.FromArgb(192,32,32),
                                  System.Drawing.Color.Empty,
                                  FONTFLAGS.FF_BOLD),
                new ColorableItem("TestLanguage – Comment",
                                  "Comment",
                                  COLORINDEX.CI_DARKGREEN,
                                  COLORINDEX.CI_LIGHTGRAY,
                                  System.Drawing.Color.FromArgb(32,128,32),
                                  System.Drawing.Color.Empty,
                                  FONTFLAGS.FF_DEFAULT)
                // ...
                // Add as many colorable items as you want to support.
            };
        }
    }
}

La classe de coloriseur et le scanner

la classe d' LanguageService de base a une méthode d' GetColorizer cette des instantiantes la classe d' Colorizer . Le scanner qui est retourné par la méthode d' GetScanner est passé au constructeur de classe d' Colorizer .

Vous devez implémenter la méthode d' GetScanner dans votre propre version de la classe d' LanguageService . La classe d' Colorizer utilise le scanner pour obtenir toutes les informations sur la couleur symboliques.

Le scanner doit satisfaire structure d' TokenInfo pour chaque jeton qu'il trouve. Cette structure contient des informations telles que l'étendue que le jeton occupe, l'index de couleurs à utiliser, le type est le jeton, et les déclencheurs symboliques (voir l' TokenTriggers). Uniquement l'étendue et l'index de couleurs sont nécessaires pour la colorisation par la classe d' Colorizer .

L'index de couleurs stocké dans la structure d' TokenInfo est en général une valeur de l'énumération d' TokenColor , qui fournit un certain nombre d'index nommés correspondant aux éléments de langage telles que les mots clés et des opérateurs. Si vos éléments qui autorisent la modification de la couleur personnalisés répertorient les correspondances les éléments présentés dans l'énumération d' TokenColor , il vous suffit d'utiliser l'énumération comme couleur pour chaque jeton. Toutefois, si vous avez des éléments qui autorisent la modification de la couleur supplémentaires ou vous ne souhaitez pas utiliser les valeurs existantes dans cette commande, vous pouvez réorganiser de la votre liste coloriable personnalisée d'éléments pour l'adapter à vos besoins et retourner l'index approprié dans cette liste. Juste assurez -vous d'affecter à l'index à TokenColor en l'enregistrant dans la structure d' TokenInfo ; Visual Studio voit uniquement l'index.

Exemple

L'exemple suivant montre comment le scanner peut identifier trois types de jetons : nombres, ponctuation, et identificateurs (ce qui ne sont pas un nombre ou une ponctuation). Cet exemple est dans des fins de illustration uniquement et ne représente pas une implémentation complète d'analyse et scanner. Elle suppose qu'il existe une classe d' Lexer avec une méthode d' GetNextToken() qui retourne une chaîne.

using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;

namespace TestLanguagePackage
{
    private Lexer lex;

    public class TestScanner : IScanner
    {
        public bool ScanTokenAndProvideInfoAboutIt(TokenInfo tokenInfo,
                                                   ref int state)
        {
            bool foundToken = false;
            string token = lex.GetNextToken();
            if (token != null)
            {
                char firstChar = token[0];
                if (Char.IsPunctuation(firstChar))
                {
                    tokenInfo.Type = TokenType.Operator;
                    tokenInfo.Color = TokenColor.Keyword;
                }
                else if (Char.IsNumber)
                {
                    tokenInfo.Type = TokenType.Literal;
                    tokenInfo.Color = TokenColor.Number;
                }
                else
                {
                    tokenInfo.Type = TokenType.Identifier;
                    tokenInfo.Color = TokenColor.Identifier;
                }
            }
            return foundToken;
        }

Voir aussi

Concepts

Analyseur de service de langage et scanner (managed de package)

Enregistrement d'un service de langage (managed de package)

Autres ressources

Fonctionnalités du service de langage (managed de package)