Sintaxe colorir (estrutura de pacote gerenciado)
Colorização de sintaxe é um recurso que faz com que os diferentes elementos de uma linguagem de programação a ser exibida em um arquivo de origem em diferentes cores e estilos. Para suportar este recurso, você precisa fornecer um analisador ou o scanner pode identificar os tipos de elementos lexicais ou símbolos no arquivo. Muitas linguagens distinguir as palavras-chave, delimitadores (como, por exemplo, parênteses ou chaves) e comentários por colori-los de maneiras diferentes.
Implementação
Para oferecer suporte a colorização, a estrutura de pacote gerenciado (MPF) inclui o Colorizer , de classe que implementa o IVsColorizer interface. Essa classe interage com um IScanner para determinar as cores e o token. Para obter mais informações sobre scanners, consulte Analisador de serviço de linguagem e o Scanner (estrutura de pacote gerenciado). O Colorizer classe, em seguida, marca cada caractere do símbolo com as informações de cor e retorna essa informação para o editor, exibindo o arquivo de origem.
As informações de cor retornadas para o editor são um índice em uma lista de itens colorable. Cada item colorable Especifica um valor de cor e um conjunto de atributos de fonte, como negrito ou tachado. O editor fornece um conjunto de itens de colorable padrão que pode usar o seu serviço de linguagem. Tudo o que você precisa fazer é especificar o índice de cor adequado para cada tipo de token. No entanto, você pode fornecer um conjunto de itens personalizados de colorable e os índices que você fornecer para tokens e sua própria lista de itens colorable em vez da lista padrão de referência. Você também deve definir o RequestStockColors entrada do registro para 0 (ou não especificar o RequestStockColors entrada todos) para oferecer suporte a cores personalizadas. Você pode definir essa entrada de registro com um parâmetro nomeado para o ProvideLanguageServiceAttribute atributos definidos pelo usuário. Para obter mais informações sobre o registro de um serviço de linguagem e definir suas opções, consulte Registrando um serviço de linguagem (estrutura de pacote gerenciado).
Personalizar itens Colorable
Para fornecer seus próprios itens de colorable personalizados, você deve substituir o GetItemCount e GetColorableItem método sobre o LanguageService classe. O primeiro método retorna o número de itens personalizados de colorable que ofereça suporte ao seu serviço de linguagem e a segunda obtém o item de colorable personalizado pelo índice. Você cria a lista padrão de itens personalizados de colorable. No construtor do seu serviço de linguagem, tudo o que você precisa fazer é fornecer a cada item colorable com um nome. Visual Studio automaticamente manipula o caso em que o usuário seleciona um conjunto diferente de itens colorable. Esse nome é o que aparece no fontes e cores página de propriedade no Opções caixa de diálogo (disponível em Visual Studio Ferramentas menu) e esse nome determina a cor que um usuário tenha substituído. As opções do usuário são armazenadas em cache no registro e acessadas pelo nome da cor. O fontes e cores página de propriedades lista todos os nomes de cores em ordem alfabética, para que você pode agrupar suas cores personalizadas precedendo cada nome de cor com seu nome de idioma. Por exemplo, "Comentário de TestLanguage"e"TestLanguage-palavra-chave". Ou você pode agrupar os itens colorable por tipo, "comentário (TestLanguage)"e"(TestLanguage) de palavra-chave". O agrupamento por nome de idioma é preferencial.
Aviso
É altamente recomendável que você incluir o nome do idioma no nome do item colorable para evitar colisões com nomes de colorable de item existentes.
Dica
Se você alterar o nome de uma das suas cores durante o desenvolvimento, você deve redefinir o cache de Visual Studio criado na primeira vez em que as cores foram acessadas.Você pode fazer isso executando o Redefinir o hive Experimental comando no menu de programa do SDK do Visual Studio.
Observe que o primeiro item na sua lista de itens colorable nunca é referenciado. Visual Studio sempre fornece as cores padrão de texto e os atributos desse item. A maneira mais fácil de lidar com isso é fornecer um item de colorable de espaço reservado como o primeiro item.
High Color itens Colorable
Colorable itens também podem oferecer suporte a valores de cores de 24 bits ou alto por meio do IVsHiColorItem interface. O MPF ColorableItem classe oferece suporte a IVsHiColorItem interface e as cores de 24 bits são especificadas no construtor junto com as cores normais. Consulte o ColorableItem classe para obter mais detalhes. O exemplo a seguir mostra como definir as cores de 24 bits para palavras-chave e comentários. As cores de 24 bits são usadas quando é oferecido suporte a cores de 24 bits na área de trabalho do usuário; Caso contrário, as cores de texto normal são usadas.
Lembre-se, que estas são as cores padrão para o seu idioma; o usuário pode alterar essas cores para desejarem.
Exemplo
Este exemplo mostra uma maneira de declarar e preencher uma matriz de itens de colorable personalizados usando o ColorableItem classe. Este exemplo define as cores de palavra-chave e comentários usando cores de 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.
};
}
}
}
A classe Colorizer e o Scanner
Base da LanguageService classe tem um GetColorizer método que instantiantes a Colorizer classe. O scanner que é retornado de GetScanner método é passado para o Colorizer construtor de classe.
Você deve implementar a GetScanner método na sua própria versão do LanguageService classe. O Colorizer classe usa o mecanismo de varredura para obter todas as informações de token de cor.
O mecanismo de varredura precisa preencher um TokenInfo estrutura para todos os tokens ele localiza. Esta estrutura contém informações como, por exemplo, o token de extensão ocupa, o índice de cor para usar, qual é o tipo os disparadores de token e token (consulte TokenTriggers). Somente o índice de cor e span são necessários para colorização pela Colorizer classe.
O índice de cor é armazenado na TokenInfo estrutura normalmente é um valor da TokenColor enumeração, que fornece um número de índices nomeados correspondentes aos diversos elementos de linguagem, como palavras-chave e operadores. Se seus itens personalizados de colorable correspondências de listar os itens apresentados a TokenColor enumeração, em seguida, você pode simplesmente usar a enumeração como a cor para cada símbolo. No entanto, se você tiver que itens adicionais de colorable ou não deseja usar os valores existentes nessa ordem, você pode organizar sua lista de itens colorable personalizados para atender às suas necessidades e retornar o índice apropriado nessa mesma lista. Apenas certifique-se de converter o índice para um TokenColor quando armazená-la na TokenInfo estrutura; Visual Studiovê somente o índice.
Exemplo
O exemplo a seguir mostra como o mecanismo de varredura pode identificar os três tipos de token: números, pontuação e identificadores (algo que não é um número ou uma pontuação). Este exemplo é apenas para fins ilustrativos e não representa uma implementação abrangente do analisador e o scanner. Ele pressupõe que haja um Lexer de classe com um GetNextToken() método que retorna uma seqüência de caracteres.
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;
}
Consulte também
Conceitos
Analisador de serviço de linguagem e o Scanner (estrutura de pacote gerenciado)
Registrando um serviço de linguagem (estrutura de pacote gerenciado)
Outros recursos
Recursos de serviço de linguagem (estrutura de pacote gerenciado)