Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O editor é composto por vários subsistemas diferentes, que são projetados para manter o modelo de texto do editor separado da exibição de texto e da interface do usuário.
Estas seções descrevem diferentes aspectos do editor:
Estas seções descrevem os recursos do editor:
Os subsistemas
Subsistema de modelo de texto
O subsistema de modelo de texto é responsável por representar o texto e habilitar sua manipulação. O subsistema de modelo de texto contém a ITextBuffer interface, que descreve a sequência de caracteres que deve ser exibida pelo editor. Esse texto pode ser modificado, rastreado e manipulado de várias maneiras. O modelo de texto também fornece tipos para os seguintes aspectos:
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 localiza 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 está livre de conceitos de interface do usuário (interface do usuário). Por exemplo, ele não é responsável pela formatação de texto ou layout de 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 MEF (Managed Extensibility Framework).
Subsistema de exibição de texto
O subsistema de exibição de texto é responsável pela formatação e exibição de texto. Os tipos nesse subsistema são divididos em duas camadas, dependendo se os tipos dependem do WPF (Windows Presentation Foundation). Os tipos mais importantes são ITextView e IWpfTextView, que controlam o conjunto de linhas de texto a serem exibidas, e também o cursor, a seleção e as instalações para adornar o texto usando elementos da interface do usuário do WPF. Esse 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úmero 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 assembly contém os elementos independentes da plataforma, e o segundo contém os elementos específicos do WPF.
Subsistema de classificação
O subsistema de classificação é responsável por determinar as propriedades da fonte para o texto. Um classificador divide o texto em classes diferentes, por exemplo, "palavra-chave" ou "comentário". O mapa de formato de classificação relaciona essas classes a propriedades reais da fonte, por exemplo, "Blue Consolas 10 pt". Essas informações são usadas pelo modo de exibição de texto quando formata e renderiza o texto. A marcação, que é descrita com mais detalhes posteriormente neste tópico, permite que os dados sejam associados a intervalos de texto.
Os tipos públicos do subsistema de classificação estão contidos em Microsoft.VisualStudio.Text.Logic.dll, e interagem com os aspectos visuais da classificação, que são contidos em Microsoft.VisualStudio.Text.UI.Wpf.dll.
Subsistema de 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 visão mais detalhada do modelo de texto e do modo de exibição de texto
O modelo de texto
O subsistema de modelo de texto consiste em diferentes agrupamentos de tipos de texto. Isso inclui o buffer de texto, as capturas de texto e os intervalos de texto.
Buffers de texto e instantâneos de texto
A ITextBuffer interface representa uma sequência de caracteres Unicode codificados usando UTF-16, que é a codificação usada pelo String 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 inicializado de uma cadeia de caracteres ou de TextReader. O buffer de texto pode ser mantido no sistema de arquivos como um ITextDocument.
Qualquer thread pode editar o buffer de texto até que um thread assuma a propriedade do buffer de texto chamando TakeThreadOwnership. Depois disso, somente esse thread poderá executar edições.
Um buffer de texto pode passar por muitas versões durante seu tempo de vida. 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 sendo alterado.
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 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 final do buffer. Os caracteres de quebra de linha são representados explicitamente 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 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
Um SnapshotPoint representa a posição de um caractere em um instantâneo. A posição é garantida a estar entre zero e o comprimento total do instantâneo. Um SnapshotSpan representa um intervalo de texto em um instantâneo. Sua posição Final tem a garantia de estar entre zero e o comprimento do instantâneo. O NormalizedSnapshotSpanCollection consiste em um conjunto de SnapshotSpan objetos da mesma captura.
Spans e ColeçõesNormalizadasDeSpan
Um Span representa um intervalo que pode ser aplicado a uma faixa de texto em um instantâneo de texto. As posições de instantâneo são baseadas em zero, portanto, os intervalos podem começar em qualquer posição, incluindo zero. A End propriedade de um intervalo é igual à soma de sua Start propriedade e sua Length propriedade. Um Span não inclui o caractere indexado pela End propriedade. Por exemplo, um intervalo 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 esse intervalo é [5..8).
Dois intervalos se cruzam se tiverem alguma posição em comum, incluindo a posição Final. Portanto, a interseção de [3, 5) e [2, 7) é [3, 5) e a interseção de [3, 5) e [5, 7) é [5, 5). (Observe que [5, 5) é um intervalo vazio.)
Dois intervalos se sobrepõem se tiverem posições em comum, exceto para a posição Final. Um intervalo vazio nunca se sobrepõe a qualquer outro intervalo, e a sobreposição de dois intervalos nunca está vazia.
Uma NormalizedSpanCollection é uma lista de intervalos na ordem das propriedades de início dos intervalos. Na lista, os intervalos sobrepostos ou adjacentes são mesclados. Por exemplo, considerando o conjunto de intervalos [5..9), [0..1), [3..6) e [9..10), a lista normalizada de intervalos é [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 do CreateEdit()) inicia uma transação de texto ITextBuffer que consiste em edições de texto. Cada edição é uma substituição de algum intervalo 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 ao estado do buffer no momento em que a transação foi iniciada. O ITextEdit objeto ajusta as coordenadas de edições 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 substitui o intervalo em [2..4) usando o caractere X e uma segunda edição que substitui o intervalo em [6..9) usando o caractere Y. O resultado é este buffer:
abXefYj
As coordenadas da segunda edição foram computadas 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 entrarão em vigor quando o objeto ITextEdit for confirmado ao chamar seu método Apply(). Se houver pelo menos uma edição não vazia, uma nova ITextVersion será criada, uma nova ITextSnapshot será criada e um Changed evento será gerado. Cada versão de texto tem uma captura 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, os instantâneos de texto devem ser usados uma vez e depois descartados, enquanto as versões de texto devem permanecer ativas por algum tempo.
Uma versão de texto contém um INormalizedTextChangeCollection. Esta coleção descreve as alterações que, quando aplicadas ao instantâneo, produzem o instantâneo subsequente. Cada ITextChange na coleção contém a posição do caractere da alteração, a string substituída e a string de substituição. A cadeia de caracteres substituída está vazia para uma inserção básica e a cadeia de caracteres de substituição está vazia para uma exclusão básica. A coleção normalizada é sempre null para a versão mais recente do buffer de texto.
Somente 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 intervalos de rastreamento
Um ITrackingPoint representa uma posição de caractere em um buffer de texto. Se o buffer for editado de uma maneira que faça com que a posição do caractere mude, o ponto de acompanhamento mudará com ele. Por exemplo, se um ponto de acompanhamento se referir à posição 10 em um buffer e cinco caracteres forem inseridos no início do buffer, o ponto de acompanhamento se referirá à posição 15. Se uma inserção ocorrer precisamente na posição indicada pelo ponto de acompanhamento, seu comportamento será determinado pelo seu PointTrackingMode, que pode ser ou Positive ou Negative. Se o modo de rastreamento for positivo, o ponto de rastreamento refere-se ao mesmo caractere, agora posicionado no final da inserção. Se o modo de acompanhamento for negativo, o ponto de acompanhamento se referirá ao primeiro caractere inserido na posição original. Se o caractere na posição representada por um ponto de acompanhamento for excluído, o ponto de acompanhamento mudará para o primeiro caractere que segue o intervalo excluído. Por exemplo, se um ponto de acompanhamento se referir ao caractere na posição 5 e os caracteres nas posições 3 a 6 forem excluídos, o ponto de acompanhamento se referirá ao caractere na posição 3.
Um ITrackingSpan representa um intervalo de caracteres em vez de apenas uma posição. Seu comportamento é determinado por sua SpanTrackingMode. Se o modo de acompanhamento de intervalo for SpanTrackingMode.EdgeInclusive, o intervalo de acompanhamento é expandido para incluir o texto inserido em suas bordas. Se o modo de acompanhamento de intervalo for SpanTrackingMode.EdgeExclusive, o intervalo de acompanhamento não incorporará o texto inserido em suas bordas. No entanto, se o modo de acompanhamento de intervalo for SpanTrackingMode.EdgePositive, uma inserção empurrará a posição atual para o início e, se o modo de acompanhamento de intervalo 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. Os pontos de acompanhamento e os intervalos de acompanhamento podem ser referenciados de maneira segura 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 "text", "code" ou "binary", ou um tipo de tecnologia como "xml", "vb" ou "c#". Por exemplo, a palavra "using" é uma palavra-chave no C# e no 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ários de outros tipos de conteúdo. O ContentTypeDefinition permite que você especifique vários tipos base como os pais 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, as margens do editor, os adornos e os manipuladores de mouse podem ser definidos para que se apliquem somente aos editores que exibem tipos de conteúdo específicos.
A exibiçã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.
Exibições de texto
A ITextView interface é uma representação independente da plataforma de uma exibição de texto. Ele é usado principalmente para exibir documentos de texto em uma janela, mas também pode ser usado para outras finalidades, por exemplo, em uma dica de ferramenta.
A exibição 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 ocorre a edição, 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 de exibição de texto
O sistema de coordenadas da visualização de texto especifica posições na visualização de texto. Nesse 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.
Um viewport (a parte do texto visível na janela de texto) não pode ser rolado horizontalmente da mesma maneira que é rolado verticalmente. Uma janela de visualização é rolada horizontalmente alterando sua coordenada esquerda, para que a janela se mova em relação à superfície de desenho. No entanto, um visor pode ser rolado verticalmente apenas alterando o texto renderizado, o que faz com que um evento LayoutChanged seja acionado.
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 o controle da 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. Essas margens são contêineres nos quais outras margens podem ser colocadas. 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 exibição de texto à qual estão anexadas. Por exemplo, a margem de número de linha exibe números de linha para a visualização de texto. A margem de glifo exibe elementos de interface do usuário.
A IWpfTextViewMarginProvider interface manipula a criação e o posicionamento das margens. As margens podem ser ordenadas em relação a outras margens. As margens de prioridade mais alta estão localizadas mais perto 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 que a margem A, a margem B aparecerá à esquerda da margem A.
O host de visualização de texto
A interface IWpfTextViewHost contém a visualização de texto e quaisquer decorações adjacentes que acompanham a visualização, por exemplo, barras de rolagem. O host de exibição de texto também contém margens anexadas a uma borda da exibição.
Texto formatado
O texto exibido em uma visualização de texto é composto por ITextViewLine objetos. Cada linha de visualização de texto corresponde a uma linha de texto no visualizador de texto. Linhas longas no buffer de texto subjacente podem ser parcialmente obscurecidas (se o encapsulamento de palavras não estiver habilitado) 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, assim como para os adornos que podem estar associados à linha.
ITextViewLine os objetos são criados usando uma IFormattedLineSource interface. Se você estiver apenas preocupado com o texto exibido no momento na exibição, poderá ignorar a origem da formatação. Se você estiver interessado no formato de texto que não é exibido na exibição (por exemplo, para dar suporte a um recorte e colagem de texto rico), poderá usar IFormattedLineSource para formatar texto em um buffer de texto.
A exibição de texto formata uma 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:
Etiquetas e classificadores
Adornos
Projection
Outlining
Associações de mouse e chave
Operações e primitivas
IntelliSense
Marcas e classificadores
As marcas são marcadores associados a um intervalo de texto. Eles podem ser apresentados de maneiras diferentes, por exemplo, usando coloração de texto, sublinhados, gráficos ou pop-ups. Classificadores são um tipo de etiqueta.
Outros tipos de tags são TextMarkerTag para realce de texto, OutliningRegionTag para delimitação, 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ários 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 tipo de classificação específico, normalmente em um intervalo de texto. A ClassificationSpan é usado para representar uma classificação. Um intervalo de classificação pode ser considerado como um rótulo que abrange um determinado intervalo de texto e informa ao sistema que esse intervalo 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 classificador é 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 em um comentário em um arquivo C#. Considere este comentário:
// This method produces a classifier
Um classificador C# pode rotular todo o intervalo como um comentário, e o classificador de idioma inglês pode classificar "produz" como um "verbo" e "método" 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 classificador também garante que não haja classificações sobrepostas e que as classificações sejam ordenadas. Classificadores individuais são livres para retornar qualquer conjunto de classificações, em qualquer ordem, e de se sobrepor de qualquer maneira.
Formatação de classificação e coloração de texto
A formatação de texto é um exemplo de um recurso baseado 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 o formato do tipo de classificação pai.
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 manipula todas as exportações de formatos de classificação.
Adornos
Adornos são efeitos gráficos que não estão diretamente relacionados à fonte e à cor dos caracteres na exibição de texto. Por exemplo, o sublinhado vermelho que é usado para marcar o código que não compila em muitas linguagens de programação é um elemento visual inserido, e as dicas de ferramenta são elementos visuais pop-up. Os adornos são derivados de UIElement e implementam ITag. Dois tipos especializados de etiqueta de adorno são o SpaceNegotiatingAdornmentTag, para adornos que ocupam o mesmo espaço que o texto em uma visualização, e o ErrorTag, para o sublinhado ondulado.
Adornos inseridos são elementos gráficos que fazem parte da exibição de texto formatado. Eles são organizados em diferentes camadas de ordem Z. Há três camadas embutidas, da seguinte maneira: o texto, o cursor e a seleção. No entanto, os desenvolvedores podem definir mais camadas e colocá-las em ordem em relação umas às outras. Os três tipos de adornos inseridos são adornos relativos a texto (que se movem quando o texto se move e são excluídos quando o texto é excluído), adornos relativos à exibiçã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).
Elementos pop-up são gráficos que aparecem em uma pequena janela acima da área de visualização do texto, como dicas de ferramenta.
Projection
A projeção é uma técnica para construir um tipo diferente de buffer de texto que realmente não armazena texto, mas 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 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 pela projeção pode ser construído para reorganizar o texto de várias maneiras diferentes. (Este conjunto também é conhecido como um grafo de buffer.) O recurso de organização de texto do Visual Studio é implementado usando um buffer de projeção para ocultar o texto fechado, e o editor Visual Studio para páginas ASP.NET usa projeção para dar suporte a linguagens embutidas, como Visual Basic e C#.
Um IProjectionBuffer é criado usando IProjectionBufferFactoryService. Um buffer de projeção é representado por uma sequência ordenada de ITrackingSpan objetos que são conhecidos como intervalos de origem. O conteúdo desses intervalos é apresentado como uma sequência de caracteres. Os buffers de texto dos quais os intervalos de origem são extraídos são chamados de 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 um intervalo de origem é alterado, 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 esses conteúdos:
A: ABCDE
B: vwxyz
Se o buffer de projeção P for formado a partir de dois intervalos de texto, um que tenha todo o buffer A e outro que tenha todo o buffer B, P terá o seguinte conteúdo:
P: ABCDEvwxyz
Se a subcadeia xy for excluída do buffer B, então o buffer P dispara 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 edições para os buffers de origem apropriados. Por exemplo, se uma cadeia de caracteres for inserida no buffer P na posição 6 (a posição original do caractere "v"), a inserção será propagada para o buffer B na posição 1.
Há restrições nos intervalos de origem que contribuem para um buffer de projeção. Os intervalos das fontes não podem se sobrepor; uma localização em um buffer de projeção não pode ser mapeada para mais de uma localização em qualquer buffer de origem, assim como uma localização em um buffer de origem não pode ser mapeada para mais de uma localização em um buffer de projeção. Nenhuma circularidade é permitida na relação de buffer de origem.
Os eventos são gerados quando ocorre uma alteração no conjunto de buffers de origem para um buffer de projeção e também quando há alterações nos intervalos de origem. Um buffer de elisão é um tipo especial de buffer de projeção. Ele é usado principalmente para estruturação de tópicos e para operações que expandem e recolhem blocos de texto. Um buffer de elisão é baseado em apenas um buffer de origem e os intervalos no buffer de elisão devem ser ordenados da mesma forma que são ordenados no buffer de origem.
O gráfico de buffer
A IBufferGraph interface permite o mapeamento através de um grafo de buffers de projeção. Todos os buffers de texto e de projeção são coletados em um grafo acíclico direcionado, assim como a árvore de sintaxe abstrata produzida por um compilador de linguagem. O grafo é definido pelo buffer superior, que pode ser qualquer buffer de texto. O gráfico de buffer pode ser mapeado de um ponto no buffer superior para um ponto em um buffer de origem ou de um intervalo no buffer superior para um conjunto de intervalos em um buffer de origem. Da mesma forma, ele pode mapear um ponto ou intervalo de um buffer de origem para um ponto no buffer superior. Os gráficos de buffer são criados usando o IBufferGraphFactoryService.
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 forem modificados, os eventos de alteração de buffer serão acionados, começando com o buffer mais profundo.
Outlining
A capacidade de esquematização é expandir ou recolher diferentes blocos de texto em uma visualização de texto. O esquema é definido como uma espécie de ITag, da mesma forma que os adornos são definidos. Uma OutliningRegionTag é uma tag que define uma região de texto que pode ser expandida ou contraída. Para usar a estrutura de tópicos, você deve importar o IOutliningManagerService para obter um IOutliningManager. O gerenciador de estrutura enumera, recolhe e expande os diferentes blocos, que são representados como ICollapsible objetos, e dispara eventos conforme necessário.
Associações de mouse
Associações de mouse vinculam movimentos do mouse a comandos diferentes. As associações do mouse são definidas usando um IMouseProcessorProvidere as associações de chave são definidas usando um IKeyProcessorProvider. O IWpfTextViewHost instancia automaticamente todas as associações e as conecta aos eventos do mouse na vista.
A IMouseProcessor interface contém manipuladores de eventos pré-processo e pós-processo para diferentes eventos do mouse. Para lidar com 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 outras finalidades. Você pode importar o IEditorOperationsFactoryService para acessar operações em um determinado ITextView. Em seguida, você pode usar esses objetos para modificar a seleção, rolar a exibição ou mover o cursor para diferentes partes da exibição.
IntelliSense
O IntelliSense dá suporte à conclusão da instrução, ajuda de assinatura (também conhecida como informações de parâmetro), Informações Rápidas e lâmpadas.
A conclusão de comandos apresenta listas pop-up com possíveis finalizações para nomes de métodos, elementos XML e outros elementos de codificação ou marcação. Em geral, um gesto de usuário invoca uma sessão de conclusão. A sessão exibe a lista de possíveis conclusões e o usuário pode selecionar uma ou ignorar a lista. O ICompletionBroker é responsável por criar e disparar o ICompletionSession. O ICompletionSource computa CompletionSet dos 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ê poderá enfrentar problemas se tentar importar algo que não existe na instalação atual do VS ou se criar incorretamente sua importação ou exportação. A principal maneira de localizar e resolver esses problemas é referenciar o Log de Erros de Composição do MEF (Managed Extensibility Framework), armazenado em %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.