Partilhar via


Por dentro do editor

O editor é composto por vários subsistemas diferentes, que são projetados para manter o modelo de texto do editor separado da visualização de texto e da interface do usuário.

Estas seções descrevem diferentes aspetos do editor:

Estas seções descrevem as características do editor:

Os subsistemas

Subsistema de modelo de texto

O subsistema do modelo de texto é responsável por representar o texto e permitir a sua manipulação. O subsistema do modelo de texto contém a ITextBuffer interface, que descreve a sequência de caracteres que deve ser exibida pelo editor. Este texto pode ser modificado, controlado e manipulado de várias maneiras. O modelo de texto também fornece tipos para os seguintes aspetos:

  • Um serviço que associa texto a arquivos e gerencia a leitura e gravação deles no sistema de arquivos.

  • Um serviço de diferenciação que encontra as diferenças mínimas entre duas sequências de objetos.

  • Um sistema para descrever o texto em um buffer em termos de subconjuntos do texto em outros buffers.

O subsistema de modelo de texto é livre de conceitos de interface do usuário (UI). Por exemplo, ele não é responsável pela formatação ou layout do texto, e não tem conhecimento de adornos visuais que possam estar associados ao texto.

Os tipos públicos do subsistema de modelo de texto estão contidos em Microsoft.VisualStudio.Text.Data.dll e Microsoft.VisualStudio.CoreUtility.dll, que dependem apenas da biblioteca de classes base do .NET Framework e do Managed Extensibility Framework (MEF).

Subsistema de visualização de texto

O subsistema de visualização de texto é responsável pela formatação e exibição de texto. Os tipos neste subsistema são divididos em duas camadas, dependendo se os tipos dependem do Windows Presentation Foundation (WPF). Os tipos mais importantes são ITextView e IWpfTextView, que controlam o conjunto de linhas de texto que devem ser exibidas, e também o curso, a seleção e os recursos para adornar o texto usando elementos WPF UI. Este subsistema também fornece margens em torno da área de exibição de texto. Essas margens podem ser estendidas e podem conter diferentes tipos de conteúdo e efeitos visuais. Exemplos de margens são exibições de números de linha e barras de rolagem.

Os tipos públicos do subsistema de exibição de texto estão contidos em Microsoft.VisualStudio.Text.UI.dll e Microsoft.VisualStudio.Text.UI.Wpf.dll. O primeiro conjunto contém os elementos independentes da plataforma e o segundo contém os elementos específicos do WPF.

Subsistema «classificação»

O subsistema de classificação é responsável por determinar as propriedades da fonte para o texto. Um classificador divide o texto em diferentes classes, por exemplo, "palavra-chave" ou "comentário". O mapa de formato de classificação relaciona essas classes com propriedades de fonte reais, por exemplo, "Blue Consolas 10 pt". Essas informações são usadas pela exibição de texto quando formata e processa texto. A marcação, que é descrita com mais detalhes mais adiante neste tópico, permite que os dados sejam associados a extensões de texto.

Os tipos públicos do subsistema de classificação estão contidos em Microsoft.VisualStudio.Text.Logic.dll, e interagem com os aspetos visuais da classificação, que estão contidos em Microsoft.VisualStudio.Text.UI.Wpf.dll.

Subsistema «Operações»

O subsistema de operações define o comportamento do editor. Ele fornece a implementação para comandos do editor do Visual Studio e o sistema de desfazer.

Uma análise mais detalhada do modelo de texto e da vista de texto

O modelo de texto

O subsistema modelo de texto consiste em diferentes agrupamentos de tipos de texto. Isso inclui o buffer de texto, instantâneos de texto e intervalos de texto.

Buffers de texto e instantâneos de texto

A ITextBuffer interface representa uma sequência de caracteres Unicode que são codificados usando UTF-16, que é a String codificação usada pelo tipo no .NET Framework. Um buffer de texto pode ser mantido como um documento do sistema de arquivos, mas isso não é necessário.

O ITextBufferFactoryService é usado para criar um buffer de texto vazio ou um buffer de texto que é inicializado a partir de uma cadeia de caracteres ou de TextReader. O buffer de texto pode ser persistido no sistema de arquivos como um arquivo ITextDocument.

Qualquer thread pode editar o buffer de texto até que um thread assuma a propriedade do buffer de texto chamando TakeThreadOwnership. Depois disso, apenas esse thread pode realizar edições.

Um buffer de texto pode passar por muitas versões durante sua vida útil. Uma nova versão é gerada sempre que o buffer é editado, e um imutável ITextSnapshot representa o conteúdo dessa versão do buffer. Como os instantâneos de texto são imutáveis, você pode acessar um instantâneo de texto em qualquer thread, sem restrições, mesmo que o buffer de texto que ele representa continue a mudar.

Instantâneos de texto e linhas de instantâneo de texto

Você pode exibir o conteúdo de um instantâneo de texto como uma sequência de caracteres ou como uma sequência de linhas. Caracteres e linhas são ambos indexados a partir de zero. Um instantâneo de texto vazio contém zero caracteres e uma linha vazia. Uma linha é delimitada por qualquer sequência de caracteres de quebra de linha Unicode válida ou pelo início ou fim do buffer. Os caracteres de quebra de linha são explicitamente representados no instantâneo de texto, e as quebras de linha em um instantâneo de texto não precisam ser todas iguais.

Observação

Para obter mais informações sobre caracteres de quebra de linha no editor do Visual Studio, consulte Codificações e quebras de linha.

Uma linha de texto é representada por um ITextSnapshotLine objeto, que pode ser obtido a partir de um instantâneo de texto para um determinado número de linha ou para uma posição de caractere específica.

SnapshotPoints, SnapshotSpans e NormalizedSnapshotSpanCollections

A SnapshotPoint representa uma posição de caractere numa captura. É garantido que a posição fique entre zero e o comprimento do instantâneo. A SnapshotSpan representa uma extensão de texto numa captura. Sua posição final é garantida entre zero e o comprimento do instantâneo. O NormalizedSnapshotSpanCollection consiste num conjunto de SnapshotSpan objetos da mesma captura.

Extensões e Coleções de Extensões Normalizadas

A Span representa um intervalo que pode ser aplicado a um trecho de texto em uma captura instantânea de texto. As posições de snapshot (captura instantânea) são baseadas em zero, portanto, os intervalos podem começar em qualquer posição, incluindo zero. A End propriedade de um span é igual à soma da sua Start propriedade e da sua Length propriedade. A Span não inclui o caractere que é indexado End pela propriedade. Por exemplo, uma extensão que tem Start=5 e Length=3 tem End=8 e inclui os caracteres nas posições 5, 6 e 7. A notação para este período é [5..8].

Dois intervalos se intersectam se tiverem qualquer posição em comum, incluindo a posição de término. Portanto, a intersecção de [3, 5) e [2, 7] é [3, 5] e a intersecção de [3, 5) e [5, 7] é [5, 5]. Note que [5, 5) é um intervalo vazio.

Dois intervalos se sobrepõem se tiverem posições em comum, exceto para a Posição Final. Um vão vazio nunca se sobrepõe a qualquer outro vão, e a sobreposição de dois vãos nunca é vazia.

A NormalizedSpanCollection é uma lista de intervalos na ordem das propriedades Start dos intervalos. Na lista, intervalos que se sobrepõem ou estão adjacentes são mesclados. Por exemplo, dado o conjunto de vãos [5..9], [0..1), [3..6) e [9..10], a lista normalizada de vãos é [0..1], [3..10].

ITextEdit, TextVersion e notificações de alteração de texto

O conteúdo de um buffer de texto pode ser alterado usando um ITextEdit objeto. A criação desse objeto (usando um dos métodos de ITextBufferCreateEdit()) inicia uma transação de texto que consiste em edições de texto. Cada edição é uma substituição de algum espaço de texto no buffer por uma cadeia de caracteres. As coordenadas e o conteúdo de cada edição são expressos em relação à cópia instantânea do buffer no momento em que a transação foi iniciada. O ITextEdit objeto ajusta as coordenadas das edições que são afetadas por outras edições na mesma transação.

Por exemplo, considere um buffer de texto que contenha esta cadeia de caracteres:

abcdefghij

Aplique uma transação que contenha duas edições, uma edição que substitua a extensão em [2..4) usando o caractere X e uma segunda edição que substitui a extensão em [6..9) usando o caractere Y. O resultado é este buffer:

abXefYj

As coordenadas para a segunda edição foram calculadas em relação ao conteúdo do buffer no início da transação, antes da primeira edição ser aplicada.

As alterações no buffer entram em vigor quando o objeto ITextEdit é confirmado chamando o seu método Apply(). Se houve pelo menos uma edição não vazia, uma nova ITextVersion é criada, uma nova ITextSnapshot é criada e um evento Changed é gerado. Cada versão de texto tem um instantâneo de texto diferente. Um instantâneo de texto representa o estado completo do buffer de texto após uma transação de edição, mas uma versão de texto descreve apenas as alterações de um instantâneo para o próximo. Em geral, as capturas de texto devem ser utilizadas uma vez e, depois, descartadas, ao passo que as versões de texto devem manter-se ativas por algum tempo.

Uma versão de texto contém um INormalizedTextChangeCollection. Esta coleção descreve as alterações que, quando aplicadas ao snapshot, produzem o snapshot subsequente. Cada ITextChange na coleção contém a posição do caractere da alteração, a cadeia de caracteres substituída e a cadeia de caracteres de substituição. A cadeia de caracteres a ser substituída está vazia para uma inserção básica e a cadeia de caracteres de substituição está vazia para uma remoção básica. A coleção normalizada é sempre null para a versão mais recente do buffer de texto.

Apenas um ITextEdit objeto pode ser instanciado para um buffer de texto a qualquer momento, e todas as edições de texto devem ser executadas no thread que possui o buffer de texto (se a propriedade tiver sido reivindicada). Uma edição de texto pode ser abandonada chamando seu Cancel método ou seu Dispose método.

ITextBuffer também fornece Insert(), Delete(), e Replace() métodos que se assemelham aos encontrados na ITextEdit interface. Chamá-los tem o mesmo efeito que criar um ITextEdit objeto, fazer a chamada semelhante e, em seguida, aplicar a edição.

Pontos de rastreamento e extensões de rastreamento

Um ITrackingPoint representa uma posição de caractere em um buffer de texto. Se o buffer for editado de uma forma que faça com que a posição do caractere mude, o ponto de rastreamento muda com ele. Por exemplo, se um ponto de rastreamento se refere à posição 10 em um buffer e cinco caracteres são inseridos no início do buffer, o ponto de rastreamento se refere à posição 15. Se uma inserção acontece precisamente na posição indicada pelo ponto de rastreamento, seu comportamento é determinado pelo seu PointTrackingMode, que pode ser qualquer um Positive ou Negative. Se o modo de rastreamento for positivo, o ponto de rastreamento refere-se ao mesmo caractere, que agora está no final da inserção. Se o modo de rastreamento for negativo, o ponto de rastreamento refere-se ao primeiro caractere inserido na posição original. Se o caractere na posição representada por um ponto de rastreamento for excluído, o ponto de rastreamento será deslocado para o primeiro caractere que segue o intervalo excluído. Por exemplo, se um ponto de rastreamento se refere ao caractere na posição 5 e os caracteres nas posições 3 a 6 são excluídos, o ponto de rastreamento se refere ao caractere na posição 3.

Um ITrackingSpan representa um intervalo de caracteres em vez de apenas uma posição. O seu comportamento é determinado pelo seu SpanTrackingMode. Se o modo de rastreamento de span for SpanTrackingMode.EdgeInclusive, a extensão de rastreamento crescerá para incorporar texto inserido em suas bordas. Se o modo de rastreamento de extensão for SpanTrackingMode.EdgeExclusive, a extensão de rastreamento não incorporará texto inserido em suas bordas. No entanto, se o modo de rastreamento de span for SpanTrackingMode.EdgePositive, uma inserção empurrará a posição atual em direção ao início e, se o modo de rastreamento de span for SpanTrackingMode.EdgeNegative, uma inserção empurrará a posição atual para o final.

Você pode obter a posição de um ponto de rastreamento ou a extensão de um intervalo de rastreamento para qualquer instantâneo do buffer de texto ao qual eles pertencem. Pontos de rastreamento e intervalos de rastreamento podem ser referenciados com segurança a partir de qualquer thread.

Tipos de conteúdo

Os tipos de conteúdo são um mecanismo para definir diferentes tipos de conteúdo. Um tipo de conteúdo pode ser um tipo de arquivo como "texto", "código" ou "binário", ou um tipo de tecnologia como "xml", "vb" ou "c#". Por exemplo, a palavra "usando" é uma palavra-chave em C# e Visual Basic, mas não em outras linguagens de programação. Portanto, a definição dessa palavra-chave seria limitada aos tipos de conteúdo "c#" e "vb".

Os tipos de conteúdo são usados como um filtro para adornos e outros elementos do editor. Muitos recursos do editor e pontos de extensão são definidos por tipo de conteúdo. Por exemplo, a coloração de texto é diferente para arquivos de texto sem formatação, arquivos XML e arquivos de código-fonte do Visual Basic. Os buffers de texto geralmente recebem um tipo de conteúdo quando são criados, e o tipo de conteúdo de um buffer de texto pode ser alterado.

Os tipos de conteúdo podem herdar várias vezes de outros tipos de conteúdo. O ContentTypeDefinition permite especificar vários tipos base como progenitores de um determinado tipo de conteúdo.

Os desenvolvedores podem definir seus próprios tipos de conteúdo e registrá-los usando o IContentTypeRegistryService. Muitos recursos do editor podem ser definidos em relação a um tipo de conteúdo específico usando o ContentTypeAttribute. Por exemplo, margens de editor, adornos e manipuladores de mouse podem ser definidos para que se apliquem apenas a editores que exibem tipos de conteúdo específicos.

A visualização de texto

A parte de exibição do padrão MVC (controlador de exibição de modelo) define a exibição de texto, a formatação da exibição, elementos gráficos como a barra de rolagem e o cursor. Todos os elementos de apresentação do editor do Visual Studio são baseados no WPF.

Vistas de texto

A ITextView interface é uma representação independente de plataforma de uma visualização de texto. Ele é usado principalmente para exibir documentos de texto em uma janela, mas também pode ser usado para outros fins, por exemplo, em uma dica de ferramenta.

A vista de texto faz referência a diferentes tipos de buffers de texto. A TextViewModel propriedade refere-se a um ITextViewModel objeto que aponta para esses três buffers de texto diferentes: o buffer de dados, que é o buffer de nível de dados superior, o buffer de edição, no qual a edição ocorre, e o buffer visual, que é o buffer exibido na exibição de texto.

O texto é formatado com base nos classificadores anexados ao buffer de texto subjacente e é adornado usando os provedores de adorno anexados à própria exibição de texto.

O sistema de coordenadas da visualização de texto

O sistema de coordenadas da vista de texto especifica as posições na vista de texto. Neste sistema de coordenadas, o valor x 0,0 corresponde à borda esquerda do texto que está sendo exibido, e o valor y 0,0 corresponde à borda superior do texto que está sendo exibido. A coordenada x aumenta da esquerda para a direita, e a coordenada y aumenta de cima para baixo.

Uma janela de visualização (a parte do texto visível na janela de texto) não pode ser rolada da mesma maneira horizontalmente como é rolada verticalmente. Uma janela de visualização é deslocada horizontalmente alterando a sua coordenada esquerda para que se mova em relação à superfície de desenho. No entanto, uma janela de visualização pode ser rolada verticalmente apenas alterando o texto renderizado, o que faz com que um LayoutChanged evento seja gerado.

As distâncias no sistema de coordenadas correspondem a pixels lógicos. Se a superfície de renderização de texto for exibida sem uma transformação de dimensionamento, uma unidade no sistema de coordenadas de renderização de texto corresponderá a um pixel na exibição.

Margens

A ITextViewMargin interface representa uma margem e permite controlar a visibilidade da margem e seu tamanho. Há quatro margens predefinidas, que são chamadas de "Superior", "Esquerda", "Direita" e "Inferior" e são anexadas à borda superior, inferior, esquerda ou direita de uma exibição. Estas margens são contentores nos quais podem ser colocadas outras margens. A interface define métodos que retornam o tamanho da margem e a visibilidade de uma margem. As margens são elementos visuais que fornecem informações adicionais sobre a vista de texto à qual estão anexadas. Por exemplo, a margem de número de linha exibe números de linha para a vista de texto. A margem do glifo exibe elementos da interface do usuário.

A IWpfTextViewMarginProvider interface lida com a criação e colocação de margens. As margens podem ser ordenadas em relação a outras margens. As margens de prioridade mais alta estão localizadas mais próximas da exibição de texto. Por exemplo, se houver duas margens esquerdas, margem A e margem B, e a margem B tiver uma prioridade menor do que a margem A, a margem B aparecerá à esquerda da margem A.

O host de visualização de texto

A IWpfTextViewHost interface contém a visualização de texto e quaisquer decorações adjacentes que acompanham a exibição, por exemplo, barras de rolagem. O host da vista de texto também contém margens acopladas a um rebordo da vista.

Texto formatado

O texto exibido numa vista de texto é composto por ITextViewLine objetos. Cada linha de exibição de texto corresponde a uma linha de texto na exibição de texto. Linhas longas no buffer de texto subjacente podem ser parcialmente obscurecidas (se a quebra automática de texto não estiver habilitada) ou divididas em várias linhas de exibição de texto. A interface ITextViewLine contém métodos e propriedades para o mapeamento entre coordenadas e caracteres, bem como para as decorações que podem ser associadas à linha.

ITextViewLine Os objetos são criados usando uma IFormattedLineSource interface. Se estiver preocupado apenas com o texto atualmente apresentado na visualização, pode ignorar a formatação de origem. Se estiver interessado no formato de texto que não é apresentado na vista (por exemplo, para suportar um recorte e colagem rich-text), pode utilizar IFormattedLineSource para formatar texto numa memória intermédia de texto.

O modo de exibição de texto formata um ITextSnapshotLine de cada vez.

Recursos do editor

Os recursos do editor são projetados para que a definição do recurso seja separada de sua implementação. O editor inclui estes recursos:

  • Tags e classificadores

  • Adornos

  • Projection

  • Outlining

  • Associações de rato e teclas

  • Operações e primitivas

  • IntelliSense

Tags e classificadores

As tags são marcadores associados a uma extensão de texto. Eles podem ser apresentados de diferentes maneiras, por exemplo, usando coloração de texto, sublinhados, gráficos ou pop-ups. Os classificadores são um tipo de etiqueta.

Outros tipos de tags são TextMarkerTag para realce de texto, OutliningRegionTag para contorno e ErrorTag para erros de compilação.

Tipos de classificação

Uma IClassificationType interface representa uma classe de equivalência, que é uma categoria abstrata de texto. Os tipos de classificação podem herdar várias vezes de outros tipos de classificação. Por exemplo, as classificações de linguagem de programação podem incluir "palavra-chave", "comentário" e "identificador", que herdam de "código". Os tipos de classificação de linguagem natural podem incluir "substantivo", "verbo" e "adjetivo", que herdam de "linguagem natural".

Classifications

Uma classificação é uma instância de um determinado tipo de classificação, normalmente ao longo de um segmento de texto. A ClassificationSpan é usado para representar uma classificação. Uma extensão de classificação pode ser pensada como um rótulo que cobre uma extensão específica de texto e informa ao sistema que essa extensão de texto é de um tipo de classificação específico.

Classificadores

Um IClassifier é um mecanismo que divide o texto em um conjunto de classificações. Os classificadores devem ser definidos para tipos de conteúdo específicos e instanciados para buffers de texto específicos. Os clientes devem implementar IClassifier para participar da classificação de texto.

Agregadores de classificadores

Um agregador de classificadores é um mecanismo que combina todos os classificadores de um buffer de texto em apenas um conjunto de classificações. Por exemplo, um classificador C# e um classificador de idioma inglês podem criar classificações sobre um comentário em um arquivo C#. Considere este comentário:

// This method produces a classifier

Um classificador C# pode rotular todo o trecho como um comentário, e o classificador em inglês pode classificar "produces" como um "verbo" e "method" como um "substantivo". O agregador produz um conjunto de classificações não sobrepostas, e o tipo do conjunto é baseado em todas as contribuições.

Um agregador de classificadores também é um classificador porque divide o texto em um conjunto de classificações. O agregador de classificadores também garante que não haja sobreposições de classificações e que as classificações sejam ordenadas. Os classificadores individuais são livres para retornar qualquer conjunto de classificações, em qualquer ordem, e sobrepondo-se de qualquer forma.

Formatação de classificação e coloração de texto

A formatação de texto é um exemplo de um recurso que se baseia na classificação de texto. Ele é usado pela camada de exibição de texto para determinar a exibição de texto em um aplicativo. A área de formatação de texto depende do WPF, mas a definição lógica de classificações não.

Um formato de classificação é um conjunto de propriedades de formatação para um tipo de classificação específico. Esses formatos herdam do formato do elemento pai do tipo de classificação.

Um IClassificationFormatMap é um mapa de um tipo de classificação para um conjunto de propriedades de formatação de texto. A implementação do mapa de formato no editor lida com todas as exportações de formatos de classificação.

Adornos

Os adornos são efeitos gráficos que não estão diretamente relacionados com a fonte e a cor dos caracteres na visualização de texto. Por exemplo, o sublinhado vermelho que é usado para marcar código não compilado em muitas linguagens de programação é um adorno incorporado, e as dicas de ferramentas são adornos pop-up. Os adornos são derivados de UIElement e implementam ITag. Dois tipos especializados de tag de adorno são o SpaceNegotiatingAdornmentTag, para adornos que ocupam o mesmo espaço que o texto numa visualização, e o ErrorTag, para o sublinhado ondulado.

Os adornos incorporados são gráficos que fazem parte da vista de texto formatada. Eles são organizados em diferentes camadas de ordem Z. Há três camadas embutidas, da seguinte forma: texto, cursor e seleção. No entanto, os desenvolvedores podem definir mais camadas e colocá-las em ordem umas em relação às outras. Os três tipos de adornos incorporados são adornos relativos ao texto (que se movem quando o texto se move e são excluídos quando o texto é excluído), adornos relativos à visualização (que têm a ver com partes não textuais da exibição) e adornos controlados pelo proprietário (o desenvolvedor deve gerenciar seu posicionamento).

Os elementos pop-up são gráficos que aparecem numa pequena janela acima da visualização de texto, por exemplo, dicas de ferramentas.

Projection

Projeção é uma técnica para construir um tipo diferente de buffer de texto que realmente não armazena texto, mas em vez disso combina texto de outros buffers de texto. Por exemplo, um buffer de projeção pode ser usado para concatenar o texto de dois outros buffers e apresentar o resultado como se estivesse em apenas um buffer, ou para ocultar partes do texto em um buffer. Um buffer de projeção pode atuar como um buffer de origem para outro buffer de projeção. Um conjunto de buffers relacionados por projeção pode ser construído para reorganizar o texto de muitas maneiras diferentes. (Esse conjunto também é conhecido como gráfico de armazenamento.) O recurso de desdobramento de texto do Visual Studio é implementado usando um buffer de projeção para ocultar o texto recolhido, e o editor Visual Studio para ASP.NET usa projeção para oferecer suporte a linguagens incorporadas, como Visual Basic e C#.

Um IProjectionBuffer é criado usando IProjectionBufferFactoryService. Um buffer de projeção é representado por uma sequência ordenada de objetos que são conhecidos como intervalos de origem. O conteúdo destes trechos é apresentado como uma sequência de caracteres. Os buffers de texto dos quais as extensões de origem são desenhadas são denominados buffers de origem. Os clientes de um buffer de projeção não precisam estar cientes de que ele difere de um buffer de texto comum.

O buffer de projeção escuta eventos de alteração de texto nos buffers de origem. Quando o texto em uma extensão de origem muda, o buffer de projeção mapeia as coordenadas de texto alteradas para suas próprias coordenadas e gera eventos apropriados de alteração de texto. Por exemplo, considere os buffers de origem A e B que têm estes conteúdos:

A: ABCDE
B: vwxyz

Se o buffer de projeção P for formado a partir de duas extensões de texto, uma que tem todo o buffer A e outra que tem todo o buffer B, então P tem o seguinte conteúdo:

P: ABCDEvwxyz

Se a substring xy for excluída do buffer B, o buffer P gerará um evento que indica que os caracteres nas posições 7 e 8 foram excluídos.

O buffer de projeção também pode ser editado diretamente. Ele propaga as edições para os buffers de origem apropriados. Por exemplo, se uma cadeia de caracteres é inserida no buffer P na posição 6 (a posição original do caractere "v"), a inserção é propagada para o buffer B na posição 1.

Existem restrições em intervalos de origem que contribuem para um buffer de projeção. As extensões de origem não podem sobrepor-se; um local num buffer de projeção não pode mapear para mais de um local em qualquer buffer de origem, e um local em um buffer de origem não pode mapear para mais de um local num buffer de projeção. Nenhuma circularidade é permitida na relação de buffer de origem.

Os eventos são disparados quando o conjunto de buffers de origem para um buffer de projeção é alterado e quando o conjunto de intervalos de origem muda. Um buffer de elisão é um tipo especial de buffer de projeção. É utilizado principalmente para delineamento e para operações que expandem e recolhem blocos de texto. Um buffer de elisão é baseado em apenas um buffer de origem, e as extensões no buffer de elisão devem ser ordenadas da mesma forma que são ordenadas no buffer de origem.

O gráfico de buffer

A IBufferGraph interface permite o mapeamento através de um gráfico de buffers de projeção. Todos os buffers de texto e buffers de projeção são coletados em um gráfico acíclico direcionado, muito parecido com a árvore de sintaxe abstrata que é produzida por um compilador de linguagem. O gráfico é definido pelo buffer superior, que pode ser qualquer buffer de texto. O gráfico de buffer pode mapear de um ponto no buffer superior para um ponto em um buffer de origem, ou de uma extensão no buffer superior para um conjunto de extensões em um buffer de origem. Da mesma forma, ele pode mapear um ponto ou extensão de um buffer de origem para um ponto no buffer superior. Os gráficos de buffer são criados usando o IBufferGraphFactoryService.

Buffers de eventos e buffers de projeção

Quando um buffer de projeção é modificado, as modificações são enviadas do buffer de projeção para os buffers que dependem dele. Depois que todos os buffers são modificados, os eventos de alteração de buffer são gerados, começando com o buffer mais profundo.

Outlining

O esboço é a capacidade de expandir ou recolher diferentes blocos de texto numa vista de texto. O contorno é definido como uma espécie de ITag, da mesma forma que os adornos são definidos. A OutliningRegionTag é uma etiqueta que define uma região de texto que pode ser expandida ou recolhida. Para usar o contorno, deves importar o IOutliningManagerService para obter um IOutliningManager. O gestor de estrutura de tópicos enumera, recolhe e expande os diferentes blocos, que são representados como objetos ICollapsible, e gera eventos conforme necessário.

Ligações do rato

As ligações do rato ligam os movimentos do rato a diferentes comandos. As ligações do mouse são definidas usando um IMouseProcessorProvider, e as ligações de tecla são definidas usando um IKeyProcessorProvider. O IWpfTextViewHost instancia automaticamente todas as ligações e as conecta a eventos do mouse na exibição.

A interface IMouseProcessor contém manipuladores de eventos de pré-processamento e pós-processamento para diferentes eventos do rato. Para manipular um dos eventos, você pode substituir alguns dos métodos em MouseProcessorBase.

Operações do editor

As operações do editor podem ser usadas para automatizar a interação com o editor, para scripts ou outros fins. Você pode importar IEditorOperationsFactoryService para acessar operações em um determinado ITextView. Em seguida, poderá usar esses objetos para modificar a seleção, deslocar a vista ou mover o cursor para diferentes partes da vista.

IntelliSense

O IntelliSense suporta preenchimento de instruções, ajuda de assinatura (também conhecida como informações de parâmetro), Informações rápidas e lâmpadas.

A conclusão da instrução fornece listas pop-up de possíveis conclusões para nomes de métodos, elementos XML e outros elementos de codificação ou marcação. Em geral, um gesto do usuário invoca uma sessão de conclusão. A sessão exibe a lista de possíveis conclusões, e o utilizador pode selecionar uma ou fechar a lista. O ICompletionBroker é responsável por criar e acionar o ICompletionSession. O ICompletionSource calcula os CompletionSet itens de conclusão para a sessão.

Solução de problemas de importação/exportação: acessar o log de erros de composição do MEF

Você pode ter problemas se tentar importar algo que não existe na instalação atual do VS ou se você criar incorretamente sua importação ou exportação. A principal maneira de localizar e resolver esses problemas é fazer referência ao log de erros de composição do Managed Extensibility Framework (MEF), armazenado em %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.