Compartilhar via


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 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 modelo de texto é responsável por representar o texto e permitir sua manipulação. O subsistema de modelo de texto contém a interface, que descreve a ITextBuffer 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 diferencial 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 está livre de conceitos de interface do usuário (UI). Por exemplo, 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 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 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 , que controlam o conjunto de linhas de texto que devem ser exibidas, e também o acento circunflexo, a seleção e IWpfTextViewos recursos para adornar o texto usando elementos da interface do usuário do WPF. Esse subsistema também fornece margens ao redor 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 assembly contém os elementos independentes de 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 diferentes classes, por exemplo, "palavra-chave" ou "comentário". O mapa de formato de classificação relaciona essas classes com propriedades reais da fonte, por exemplo, "Blue Consolas 10 pt". Essas informações são usadas pelo modo de exibição de texto quando ele formata e renderiza 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 aspectos visuais da classificação, que estã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, instantâneos de texto e extensões 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 codificação usada pelo String tipo no .NET Framework. Um buffer de texto pode ser persistido 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 a partir de uma cadeia de caracteres ou de TextReader. O buffer de texto pode ser persistido para o sistema de arquivos como um ITextDocumentarquivo .

Qualquer thread pode editar o buffer de texto até que um thread se aproprie do buffer de texto chamando TakeThreadOwnership. Depois disso, somente esse thread pode executar edições.

Um buffer de texto pode passar por muitas versões durante sua vida útil. Uma nova versão é gerada toda vez 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 ser 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 fim 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 objeto, que pode ser obtido de um instantâneo de texto para um ITextSnapshotLine número de linha específico ou para uma posição de caractere específica.

SnapshotPoints, SnapshotSpans e NormalizedSnapshotSpanCollections

A SnapshotPoint representa uma posição de caractere em um instantâneo. A posição é garantida entre zero e o comprimento do instantâneo. A SnapshotSpan representa uma extensão de texto em um instantâneo. Sua posição End é garantida entre zero e o comprimento do instantâneo. O NormalizedSnapshotSpanCollection consiste em um conjunto de SnapshotSpan objetos do mesmo instantâneo.

Spans e NormalizedSpanCollections

A Span representa um intervalo que pode ser aplicado a uma extensão de texto em um instantâneo de texto. As posições de snapshot são baseadas em zero, portanto, as extensões podem começar em qualquer posição, incluindo zero. A End propriedade de um span é igual à soma de sua propriedade e sua StartLength propriedade. A Span não inclui o caractere indexado End pela propriedade. Por exemplo, um span 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 intervalo é [5..8].

Dois vãos se cruzam se tiverem alguma posição em comum, incluindo a posição Fim. Portanto, a intersecção de [3, 5) e [2, 7) é [3, 5) e a intersecção de [3, 5) e [5, 7) é [5, 5]. (Observe que [5, 5) é um espaço vazio.)

Dois vãos se sobrepõem se tiverem posições em comum, exceto a posição Final. Uma extensão vazia nunca se sobrepõe a qualquer outra extensão, e a sobreposição de duas extensões nunca é vazia.

A NormalizedSpanCollection é uma lista de extensões na ordem das propriedades Start das transgressões. Na lista, as extensões sobrepostas ou adjacentes são mescladas. 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 de tal objeto (usando um dos métodos de ) inicia uma transação de CreateEdit()ITextBuffertexto que consiste em edições de texto. Cada edição é uma substituição de alguma extensã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 ao instantâneo do buffer quando 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 essa 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 e uma segunda edição que substitua a extensão em [6..9) usando o caractere XY. 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 que a primeira edição fosse aplicada.

As alterações no buffer entram em vigor quando o ITextEdit objeto é confirmado chamando seu Apply() método. Se houve pelo menos uma edição não vazia, uma nova é criada, uma nova ITextVersionITextSnapshot é criada e um Changed evento é 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, 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 INormalizedTextChangeCollectionarquivo . 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 cadeia de caracteres substituída e a cadeia de caracteres 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 objeto pode ser instanciado para um ITextEdit 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 método ou seu CancelDispose método.

ITextBuffer também fornece Insert(), Delete()e Replace() métodos que se assemelham aos ITextEdit encontrados na 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 controle mudará com ele. Por exemplo, se um ponto de controle se refere à posição 10 em um buffer e cinco caracteres são inseridos no início do buffer, o ponto de controle se refere à posição 15. Se uma inserção acontece precisamente na posição indicada pelo ponto de rastreamento, seu comportamento é determinado por seu PointTrackingMode, que pode ser ou PositiveNegative. Se o modo de rastreamento for positivo, o ponto de rastreamento se refere ao mesmo caractere, que agora está no final da inserção. Se o modo de rastreamento for negativo, o ponto de rastreamento se refere ao primeiro caractere inserido na posição original. Se o caractere na posição representada por um ponto de controle for excluído, o ponto de controle mudará 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. Seu comportamento é determinado por seu SpanTrackingMode. Se o modo de controle de span for SpanTrackingMode.EdgeInclusive, o span de controle crescerá para incorporar texto inserido em suas bordas. Se o modo de controle de span for SpanTrackingMode.EdgeExclusive, o span de controle não incorporará o texto inserido em suas bordas. No entanto, se o modo de controle de span for SpanTrackingMode.EdgePositive, uma inserção empurrará a posição atual para o 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 controle ou a extensão de um período de controle para qualquer instantâneo do buffer de texto ao qual eles pertencem. Pontos de rastreamento e extensões 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 do 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 de outros tipos de conteúdo. O ContentTypeDefinition permite especificar 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 com relação a um tipo de conteúdo específico usando o ContentTypeAttribute. Por exemplo, margens do editor, adornos e manipuladores de mouse podem ser definidos para que se apliquem apenas a editores que exibem tipos de conteúdo específicos.

O modo de exibição de texto

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

Modos de exibição de texto

A ITextView interface é uma representação independente de 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 outros fins, por exemplo, em uma dica de ferramenta.

O modo de 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 no modo de 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 do modo de exibição de texto

O sistema de coordenadas do modo de exibição de texto especifica as posições no modo de exibiçã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 visor (a parte do texto visível na janela de texto) não pode ser rolado da mesma maneira horizontalmente que é rolado verticalmente. Um visor é rolado horizontalmente alterando sua coordenada esquerda para que ele se mova em relação à superfície de desenho. No entanto, um visor pode ser rolado verticalmente somente 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 escala, uma unidade no sistema de coordenadas de renderização de texto corresponderá a um pixel na tela.

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 o modo de exibição de texto ao qual estão anexadas. Por exemplo, a margem de número de linha exibe números de linha para o modo de exibição 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 perto do modo de 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 exibiçã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 do modo de exibição de texto também contém margens anexadas a uma borda do modo de exibição.

Texto formatado

O texto exibido em um modo de exibição de texto é composto de ITextViewLine objetos. Cada linha de exibição de texto corresponde a uma linha de texto no modo de exibição de texto. Linhas longas no buffer de texto subjacente podem ser parcialmente obscurecidas (se a quebra automática de linha não estiver habilitada) ou quebradas em várias linhas de exibição de texto. A ITextViewLine interface contém métodos e propriedades para mapeamento entre coordenadas e caracteres, e para os adornos que podem estar associados à linha.

ITextViewLine objetos são criados usando uma IFormattedLineSource interface. Se você estiver apenas preocupado com o texto que é exibido atualmente no modo de exibição, você pode ignorar a fonte de formatação. Se você estiver interessado no formato de texto que não é exibido no modo de exibição (por exemplo, para dar suporte a um recorte e colagem de rich text), poderá usar IFormattedLineSource para formatar texto em um buffer 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

  • Projeção

  • Estrutura de tópicos

  • Ligações de mouse e teclas

  • Operações e primitivas

  • IntelliSense

Tags e classificadores

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

Outros tipos de tags são TextMarkerTag para realce de texto, OutliningRegionTag para estrutura de tópicos 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 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".

Classificações

Uma classificação é uma instância de um tipo de classificação específico, normalmente ao longo de uma extensão 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 diz ao sistema que essa extensão de texto é de um tipo de classificação particular.

Classificadores

An 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 toda a extensão como um comentário, e o classificador de língua inglesa 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ção de classificações e que as classificações sejam classificadas. Os classificadores individuais são livres para retornar qualquer conjunto de classificações, em qualquer ordem, e sobrepostas de qualquer forma.

Classificação, formataçã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 pai do tipo de classificação.

An 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

Adornos são efeitos gráficos que não estão diretamente relacionados à fonte e à cor dos caracteres na visualização de texto. Por exemplo, o sublinhado de rabisco vermelho que é usado para marcar código não compilado em muitas linguagens de programação é um adorno incorporado, e dicas de ferramentas são adornos pop-up. Os adornos são derivados e UIElement implementados ITag. Dois tipos especializados de etiqueta de adorno são o , para adornos que ocupam o mesmo espaço que o texto em uma vista, e o , para o SpaceNegotiatingAdornmentTagErrorTagsublinhado rabisco.

Os adornos incorporados são elementos gráficos que fazem parte do modo de exibição de texto formatado. Eles são organizados em diferentes camadas de ordem Z. Há três camadas internas, como segue: texto, acento circunflexo e 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 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 à 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 sua colocação).

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

Projeção

A projeção é uma técnica para construir um tipo diferente de buffer de texto que 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 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 buffer.) O recurso de estrutura de tópicos de texto do Visual Studio é implementado usando um buffer de projeção para ocultar o texto recolhido, e o editor do Visual Studio para páginas 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 extensões de ITrackingSpan origem. O conteúdo desses vãos é apresentado como uma sequência de caracteres. Os buffers de texto dos quais as extensões de origem são extraídas 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 é alterado, o buffer de projeção mapeia as coordenadas de texto alteradas para suas próprias coordenadas e gera eventos de alteração de texto apropriados. 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 tenha todo o buffer A e a outra que tenha todo o buffer B, então P terá o seguinte conteúdo:

P: ABCDEvwxyz

Se a subcadeia de caracteres for excluída do buffer B, o buffer P gerará um evento que indica que os caracteres xy 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 é 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.

Há restrições nas extensões de origem que contribuem para um buffer de projeção. As extensões de origem podem não se sobrepor; Um local em um 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 em um buffer de projeção. Nenhuma circularidade é permitida na relação de buffer de origem.

Os eventos são gerados quando o conjunto de buffers de origem para um buffer de projeção é alterado e quando o conjunto de extensões de origem é alterado. Um buffer de elisão é um tipo especial de buffer de projeção. Ele é usado principalmente para estrutura 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 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 em 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 um span 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.

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.

Estrutura de tópicos

A estrutura de tópicos é a capacidade de expandir ou recolher diferentes blocos de texto em um modo de exibição de texto. O delineamento é definido como uma espécie de ITag, da mesma forma que os adornos são definidos. A OutliningRegionTag é uma marca que define uma região de texto que pode ser expandida ou recolhida. Para usar a estrutura de tópicos, você deve importar o IOutliningManagerService para obter um IOutliningManagerarquivo . O gerenciador de estrutura de tópicos enumera, recolhe e expande os diferentes blocos, que são representados como ICollapsible objetos, e gera eventos de acordo.

Ligações do mouse

As ligações do mouse vinculam os movimentos do mouse a diferentes comandos. As ligações do mouse são definidas usando um , e as ligações de chave são definidas usando um IMouseProcessorProviderIKeyProcessorProviderarquivo . O IWpfTextViewHost instancia automaticamente todas as ligações e as conecta a eventos do mouse no modo de exibição.

A IMouseProcessor interface contém manipuladores de eventos pré e pós-processo para diferentes eventos de mouse. Para manipular um dos eventos, você pode substituir alguns dos métodos no 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 as operações para acessar em IEditorOperationsFactoryService um determinado ITextViewarquivo . Em seguida, você pode usar esses objetos para modificar a seleção, rolar o modo de exibição ou mover o cursor para diferentes partes do modo de exibição.

IntelliSense

O IntelliSense oferece suporte à conclusão 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étodo, 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 usuário pode selecionar uma ou descartar a lista. O ICompletionBroker é responsável por criar e acionar o ICompletionSession. O ICompletionSource computa os CompletionSet itens de conclusão da sessão.

Solução de problemas de importação/exportação: acesse 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 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 MEF (Managed Extensibility Framework), armazenado em %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.