Condividi tramite


Colore di sintassi (managed package Framework)

La colorazione della sintassi è una funzionalità che comporta diversi elementi di un linguaggio di programmazione ad essere visualizzate in un file di origine ai colori e negli stili diversi. Per supportare questa funzionalità, è necessario fornire un parser o uno scanner che possono identificare i tipi di elementi oppure di token lessicali nel file. Molti linguaggi distinguono le parole chiave, i delimitatori (quali parentesi o parentesi graffe) e i commenti colorandoli in modi diversi.

Implementazione

Per supportare la colorazione, il framework gestito del pacchetto (MPF) include la classe di Colorizer , che implementa l'interfaccia di IVsColorizer . Questa classe interagisce con IScanner per determinare il token e i colori. per ulteriori informazioni sugli scanner, vedere Parser del servizio di linguaggio e analisi (managed package Framework). La classe di Colorizer si contrassegna ogni carattere del token con le informazioni sui colori e restituisce le informazioni all'editor in cui viene visualizzato il file di origine.

Le informazioni sui colori restituite nell'editor sono un indice in un elenco di elementi colorabili. Ogni elemento il colore specifica un valore di colore e un set di attributi del tipo di carattere, in grassetto o strikethrough. L'editor fornisce un insieme di elementi colorabili predefiniti che il servizio di linguaggio possibile utilizzare. È sufficiente impostare consiste nello specificare l'indice di colore appropriato per ogni tipo di token. Tuttavia, è possibile fornire un insieme di elementi colorabili personalizzati e degli indici fornite per i token e si fa riferimento al proprio elenco di elementi colorabili anziché l'elenco predefinito. È necessario impostare anche la voce del Registro di sistema di RequestStockColors e 0 (o non specificare la voce di RequestStockColors alcuno) per supportare i colori personalizzati. È possibile impostare questa voce del Registro di sistema con un parametro denominato all'attributo definito dall'utente di ProvideLanguageServiceAttribute . Per ulteriori informazioni su registrare un servizio di linguaggio e sull'impostazione delle opzioni, vedere Registrando un servizio di linguaggio (managed package Framework).

elementi colorabili personalizzati

Per fornire ad altri elementi colorabili personalizzati, è necessario eseguire l'override di GetItemCount e il metodo di GetColorableItem sulla classe di LanguageService . Il primo metodo restituisce il numero di elementi colorabili personalizzati che supporta del servizio di linguaggio e i secondi ottiene al colore personalizzato tramite l'indice. Creare l'elenco predefinito degli elementi colorabili personalizzati. Nel costruttore del servizio di linguaggio, è sufficiente impostare consiste nel fornire ogni elemento il colore con un nome. Visual Studio gestisce automaticamente il caso in cui l'utente seleziona un diverso insieme di elementi colorabili. Questo nome è quello visualizzato nella pagina delle proprietà di Tipi di carattere e colori nella finestra di dialogo opzioni (disponibile dal menu di Visual Studio strumenti ) e questo nome determina il colore un utente ha eseguito l'override. Le scelte dell'utente vengono memorizzate nella cache nel Registro di sistema e accessibili dal nome di un colore. La pagina delle proprietà di Tipi di carattere e colori elenca tutti i nomi di colore in ordine alfabetico, pertanto è possibile raggruppare i colori personalizzati facendo precedere ogni nome di colore con il nome della lingua, ad esempio, “commento di TestLanguage-„ e “parola chiave di TestLanguage-„. Oppure è possibile raggruppare gli elementi colorabili per tipo, “commento (TestLanguage)„ e “parola chiave (TestLanguage)„. Raggruppamento dal nome della lingua viene preferito.

Avviso

Si consiglia di includere il nome della lingua nel nome dell'elemento il colore per evitare conflitti con i nomi degli elementi colorabili esistenti.

Nota

Se si modifica il nome di uno dei colori durante lo sviluppo, è necessario reimpostare la cache che Visual Studio creato la prima volta i colori è stato eseguito.È possibile eseguire il comando di Reimpostare l'hive controversi dal menu di programmi Visual Studio SDK.

Si noti che il primo elemento nell'elenco di elementi colorabili non viene fatto riferimento mai. Visual Studio fornisce sempre i colori del testo e gli attributi predefiniti per tale elemento. Il modo più semplice per risolvere questo problema consiste nel fornire un elemento il colore segnaposto come primo elemento.

Elementi colorabili di colore attivata

Gli elementi colorabili possono inoltre supportare 24 bit o valori di colore attivato con IVsHiColorItem collegamento. La classe di MPF ColorableItem supporta l'interfaccia di IVsHiColorItem e il 24 dispone di un bit i colori viene specificato nel costruttore con colori normali. Vedere la classe di ColorableItem per ulteriori informazioni. Nell'esempio riportato di seguito viene illustrato come impostare il di 24 bit i colori per le parole chiave e commenti. Il di 24 bit i colori viene utilizzato quando 24 colori di bit sono supportati sul desktop dell'utente; in caso contrario, i colori del testo normali vengono utilizzati.

È importante ricordare, questi sono i colori predefiniti del linguaggio; l'utente può modificare i colori a cui desiderano.

Esempio

In questo esempio viene illustrata una modalità per dichiarare e popolare una matrice di elementi colorabili personalizzati utilizzando la classe di ColorableItem . In questo esempio vengono impostati i colori di commento e di parole chiave con 24 colori di bit.

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 di Colorizer e lo scanner

La classe di LanguageService di base dispone di un metodo di GetColorizer che instantiantes la classe di Colorizer . Lo scanner restituito dal metodo di GetScanner viene passato al costruttore della classe di Colorizer .

È necessario implementare il metodo di GetScanner nella propria versione della classe di LanguageService . La classe di Colorizer utilizza lo scanner per ottenere tutte le informazioni sui colori dei token.

Lo scanner necessario popolare una struttura di TokenInfo per ogni token rilevati. Questa struttura contiene le informazioni dell'intervallo che il token occupa, l'indice di colore per utilizzare, il tipo è il token e trigger di token (vedere TokenTriggers). Solo l'ampiezza e il valore di colore sono necessari per la colorazione dalla classe di Colorizer .

L'indice di colore archiviato nella struttura di TokenInfo è in genere un valore dall'enumerazione di TokenColor , che fornisce una serie di valori denominati che corrispondono ai diversi elementi di linguaggio quali le parole chiave e operatori. Se gli elementi colorabili personalizzati vengono elencate le corrispondenze gli elementi definiti nell'enumerazione TokenColor , è sufficiente utilizzare l'enumerazione come il colore per ciascun token. Tuttavia, se si dispone di elementi colorabili aggiuntivi o non si desidera utilizzare i valori esistenti in quest'ordine, è possibile disporre l'elenco il colore personalizzato degli elementi per le necessità e restituire il valore appropriato nell'elenco. Essere semplicemente sicuro di eseguire il cast dell'indice a TokenColor quando si archiviano nella struttura di TokenInfo ; Visual Studio vedere solo indice.

Esempio

Nell'esempio seguente viene illustrato come lo scanner possibile identificare tre tipi di token: numeri, segni di punteggiatura e identificatori (non sia un numero o una punteggiatura. Questo esempio è solo a titolo esemplificativo e non rappresenta l'implementazione completa di analisi e del parser. Si presuppone che sia presente una classe di Lexer con un metodo di GetNextToken() che restituisca una stringa.

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;
        }

Vedere anche

Concetti

Parser del servizio di linguaggio e analisi (managed package Framework)

Registrando un servizio di linguaggio (managed package Framework)

Altre risorse

Funzionalità del servizio di linguaggio (managed package Framework)