Coloration de syntaxe dans un Service de langage héritéSyntax Colorizing in a Legacy Language Service

Coloration de syntaxe est une fonctionnalité qui provoque des éléments d’un langage de programmation à afficher dans un fichier source dans différentes couleurs et styles.Syntax colorization is a feature that causes different elements of a programming language to be displayed in a source file in different colors and styles. Pour prendre en charge cette fonctionnalité, vous devez fournir un analyseur ou l’analyseur qui peut identifier les types d’éléments lexicaux ou des jetons dans le fichier.To support this feature, you need to supply a parser or scanner that can identify the types of lexical elements or tokens in the file. De nombreux langages distinguent des mots clés, les délimiteurs (tels que des parenthèses ou d’accolades) et les commentaires en les colorisation de différentes façons.Many languages distinguish keywords, delimiters (such as parentheses or braces), and comments by colorizing them in different ways.

Les services de langage hérité sont implémentés en tant que partie d’un VSPackage, mais la plus récente pour implémenter des fonctionnalités de service de langage consiste à utiliser des extensions MEF.Legacy language services are implemented as part of a VSPackage, but the newer way to implement language service features is to use MEF extensions. Pour plus d’informations, consultez étendre l’éditeur et les Services de langage.To find out more, see Extending the Editor and Language Services.

Note

Nous vous recommandons de commencer à utiliser l’API de l’éditeur de nouveau dès que possible.We recommend that you begin to use the new editor API as soon as possible. Cela améliorer les performances de votre service de langage et vous permettent de tirer parti des nouvelles fonctionnalités de l’éditeur.This will improve the performance of your language service and let you take advantage of new editor features.

ImplémentationImplementation

Pour prendre en charge la colorisation, managed package framework (MPF) inclut le Colorizer classe qui implémente le IVsColorizer interface.To support colorization, the managed package framework (MPF) includes the Colorizer class, which implements the IVsColorizer interface. Cette classe interagit avec un IScanner pour déterminer le jeton et les couleurs.This class interacts with an IScanner to determine the token and colors. Pour plus d’informations sur les analyseurs, consultez Analyseur de Service de langage hérité et analyseur.For more information on scanners, see Legacy Language Service Parser and Scanner. La Colorizer classe, puis marque chaque caractère du jeton avec les informations de couleur et renvoie ces informations à l’éditeur affiche le fichier source.The Colorizer class then marks each character of the token with the color information and returns that information to the editor displaying the source file.

Les informations de couleur dans l’éditeur sont un index dans une liste de propriétés.The color information returned to the editor is an index into a list of colorable items. Chaque élément coloriable spécifie une valeur de couleur et un ensemble d’attributs de police, tels que le gras ou barré.Each colorable item specifies a color value and a set of font attributes, such as bold or strikethrough. L’éditeur fournit un ensemble d’éléments coloriable par défaut utilisable par votre service de langage.The editor supplies a set of default colorable items that your language service can use. Vous devez faire est de spécifier l’index de la couleur appropriée pour chaque type de jeton.All you need to do is specify the appropriate color index for each token type. Toutefois, vous pouvez fournir un ensemble d’éléments coloriable personnalisés et les indices de que vous fournissez des jetons et référencer votre propre liste d’éléments coloriable au lieu de la liste par défaut.However, you can provide a set of custom colorable items and the indices you supply for tokens, and reference your own list of colorable items instead of the default list. Vous devez également définir le RequestStockColors entrée de Registre sur 0 (ou ne spécifiez pas la RequestStockColors entrée tout) pour prendre en charge les couleurs personnalisées.You must also set the RequestStockColors registry entry to 0 (or do not specify the RequestStockColors entry at all) to support custom colors. Vous pouvez définir cette entrée de Registre avec un paramètre nommé pour la ProvideLanguageServiceAttribute définis par l’utilisateur.You can set this registry entry with a named parameter to the ProvideLanguageServiceAttribute user-defined attribute. Pour plus d’informations sur l’inscription d’un service de langage et en définissant ses options, consultez l’inscription d’un Service de langage hérité.For more information on registering a language service and setting its options, see Registering a Legacy Language Service.

Éléments coloriable personnalisésCustom Colorable Items

Pour fournir vos propres éléments coloriable personnalisés, vous devez substituer la GetItemCount et GetColorableItem méthode sur la LanguageService classe.To supply your own custom colorable items, you must override the GetItemCount and GetColorableItem method on the LanguageService class. La première méthode retourne le nombre d’éléments coloriable personnalisés qui prend en charge par votre service de langage et la seconde Obtient l’élément coloriable personnalisé par index.The first method returns the number of custom colorable items that your language service supports and the second gets the custom colorable item by index. Vous créez la liste par défaut des éléments coloriable personnalisés.You create the default list of custom colorable items. Dans le constructeur de votre service de langage, vous devez simplement fournir chaque élément coloriable avec un nom.In the constructor of your language service, all you need to do is supply each colorable item with a name. Visual Studio gère automatiquement le cas où l’utilisateur sélectionne un ensemble différent de propriétés.Visual Studio automatically handles the case where the user selects a different set of colorable items. Ce nom est ce qui s’affiche dans le polices et couleurs page de propriétés sur le Options boîte de dialogue (disponible à partir de Visual Studio outils menu) et détermine ce nom couleur d’un utilisateur a été remplacée.This name is what appears in the Fonts and Colors property page on the Options dialog box (available from Visual Studio Tools menu) and this name determines which color a user has overridden. Choix de l’utilisateur sont stockées dans un cache dans le Registre et accessibles par le nom de couleur.The user's choices are stored in a cache in the registry and accessed by the color name. Le polices et couleurs page de propriétés répertorie tous les noms de couleur dans l’ordre alphabétique, vous pouvez regrouper vos couleurs personnalisées en faisant précéder chaque nom de couleur de votre langue ; par exemple, «TestLanguage - commentaire« et »TestLanguage - mot clé».The Fonts and Colors property page lists all of the color names in alphabetical order, so you can group your custom colors by preceding each color name with your language name; for example, "TestLanguage- Comment" and "TestLanguage- Keyword". Ou vous pouvez regrouper vos éléments coloriable par type, «commentaire (TestLanguage)« et »(mot clé) (TestLanguage)».Or you can group your colorable items by type, "Comment (TestLanguage)" and "Keyword (TestLanguage)". Regroupement par nom de la langue est par défaut.Grouping by language name is preferred.

Caution

Il est fortement recommandé d’inclure le nom du langage dans le nom de l’élément coloriable pour éviter les conflits avec des noms d’élément coloriable existants.It is strongly recommended that you include the language name in the colorable item name to avoid collisions with existing colorable item names.

Note

Si vous modifiez le nom de l’un de vos couleurs pendant le développement, vous devez réinitialiser le cache de Visual Studio a créé la première fois que les couleurs ont été accédés.If you change the name of one of your colors during development, you must reset the cache that Visual Studio created the first time your colors were accessed. Vous pouvez le faire en exécutant la réinitialiser la ruche expérimentale commande dans le menu du programme Visual Studio SDK.You can do so by running the Reset the Experimental Hive command from the Visual Studio SDK program menu.

Notez que le premier élément dans votre liste de propriétés n’est jamais référencé.Note that the first item in your list of colorable items is never referenced. Visual Studio fournit toujours les couleurs de texte par défaut et les attributs de cet élément.Visual Studio always supplies the default text colors and attributes for that item. Des solutions à ce problème, le plus simple consiste à fournir un élément coloriable d’espace réservé en tant que le premier élément.The easiest way of dealing with this is to supply a placeholder colorable item as the first item.

Éléments coloriable de couleursHigh Color Colorable Items

Éléments coloriable peuvent prennent également en charge les valeurs de couleur 24 bits ou élevé à la IVsHiColorItem interface.Colorable items can also support 24-bit or high color values through the IVsHiColorItem interface. MPF ColorableItem classe prend en charge la IVsHiColorItem interface et les couleurs 24 bits sont spécifiées dans le constructeur, ainsi que les couleurs normales.The MPF ColorableItem class supports the IVsHiColorItem interface and the 24-bit colors are specified in the constructor along with the normal colors. Pour plus d'informations, consultez la classe ColorableItem.See the ColorableItem class for more details. L’exemple ci-dessous montre comment définir les couleurs 24 bits pour les mots clés et des commentaires.The example below shows how to set the 24-bit colors for keywords and comments. Les couleurs 24 bits sont utilisés lors de la couleur 24 bits est pris en charge sur le bureau de l’utilisateur ; Sinon, les couleurs de texte normal sont utilisés.The 24-bit colors are used when 24-bit color is supported on the user's desktop; otherwise, the normal text colors are used.

N’oubliez pas, que ce sont les couleurs par défaut pour votre langue ; l’utilisateur peut modifier ces couleurs à leur convenance.Remember, these are the default colors for your language; the user can change these colors to whatever they want.

ExempleExample

Cet exemple montre une manière à déclarer et remplir un tableau d’éléments de coloriable personnalisés à l’aide de la ColorableItem classe.This example shows one way to declare and populate an array of custom colorable items using the ColorableItem class. Cet exemple définit les couleurs des mots clés et des commentaires à l’aide de couleurs 24 bits.This example sets the keyword and comment colors using 24-bit colors.

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 Coloriseur et l’analyseurThe Colorizer class and the Scanner

La base de LanguageService classe a un GetColorizer méthode ce instantiantes la Colorizer classe.The base LanguageService class has a GetColorizer method that instantiantes the Colorizer class. L’analyseur est retourné à partir de la GetScanner est passé à la méthode le Colorizer constructeur de classe.The scanner that is returned from the GetScanner method is passed to the Colorizer class constructor.

Vous devez implémenter la GetScanner méthode dans votre propre version de la LanguageService classe.You must implement the GetScanner method in your own version of the LanguageService class. La Colorizer classe utilise le moteur d’analyse pour obtenir toutes les informations de jeton de couleur.The Colorizer class uses the scanner to obtain all token color information.

L’analyseur a besoin pour remplir un TokenInfo structure pour chaque jeton de recherche.The scanner needs to populate a TokenInfo structure for every token it finds. Cette structure contient des informations telles que l’étendue du jeton occupe, l’index de la couleur à utiliser, le type est les déclencheurs de jetons et de jetons (voir TokenTriggers).This structure contains information such as the span the token occupies, the color index to use, what type is the token, and token triggers (see TokenTriggers). Seul l’index d’étendue et de couleur sont nécessaires pour la colorisation par la Colorizer classe.Only the span and color index are needed for colorization by the Colorizer class.

L’index de couleur est stocké dans le TokenInfo structure est généralement une valeur à partir de la TokenColor énumération, qui fournit un certain nombre d’indices nommées correspondant aux différents éléments de langage tels que les mots clés et les opérateurs.The color index stored in the TokenInfo structure is typically a value from the TokenColor enumeration, which provides a number of named indices corresponding to various language elements such as keywords and operators. Si vos éléments coloriable personnalisés liste des correspondances les éléments présentés dans le TokenColor énumération, puis vous pouvez simplement utiliser l’énumération comme couleur pour chaque jeton.If your custom colorable items list matches the items presented in the TokenColor enumeration, then you can just use the enumeration as the color for each token. Toutefois, si vous avez d’autres éléments coloriable ou que vous ne souhaitez pas utiliser les valeurs existantes dans l’ordre, vous pouvez organiser votre liste coloriable personnalisé pour répondre à vos besoins et de retourner l’index approprié dans cette liste.However, if you have additional colorable items or you do not want to use the existing values in that order, you can arrange your custom colorable items list to suit your needs and return the appropriate index into that list. Veillez à effectuer un cast de l’index à un TokenColor lors du stockage dans le TokenInfo structure ; Visual StudioVisual Studio voit uniquement l’index.Just be sure to cast the index to a TokenColor when storing it in the TokenInfo structure; Visual StudioVisual Studio sees only the index.

ExempleExample

L’exemple suivant montre comment l’analyseur peut identifier les trois types de jetons : nombres, signes de ponctuation et les identificateurs (tout ce qui n’est pas un nombre ou un signe de ponctuation).The following example shows how the scanner might identify three token types: numbers, punctuation, and identifiers (anything that is not a number or punctuation). Cet exemple est à titre d’illustration uniquement et ne représente pas une implémentation complète de l’analyseur et l’Analyseur de.This example is for illustrative purposes only and does not represent a comprehensive parser and scanner implementation. Il suppose qu’il existe un Lexer classe avec un GetNextToken() méthode qui retourne une chaîne.It assumes that there is a Lexer class with a GetNextToken() method that returns a string.

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(firstChar))  
                {  
                    tokenInfo.Type = TokenType.Literal;  
                    tokenInfo.Color = TokenColor.Number;  
                }  
                else  
                {  
                    tokenInfo.Type = TokenType.Identifier;  
                    tokenInfo.Color = TokenColor.Identifier;  
                }  
            }  
            return foundToken;  
        }  

Voir aussiSee Also

Fonctionnalités de Service de langage hérité Legacy Language Service Features
Analyseur et l’Analyseur de Service de langage hérité Legacy Language Service Parser and Scanner
L’inscription d’un Service de langage héritéRegistering a Legacy Language Service