All'interno dell'editor

L'editor è costituito da diversi sottosistemi, progettati per mantenere il modello di testo dell'editor separato dalla visualizzazione testo e dall'interfaccia utente.

Queste sezioni descrivono diversi aspetti dell'editor:

Queste sezioni descrivono le funzionalità dell'editor:

Sottosistemi

Sottosistema del modello di testo

Il sottosistema del modello di testo è responsabile della rappresentazione del testo e dell'abilitazione della relativa manipolazione. Il sottosistema del modello di testo contiene l'interfaccia ITextBuffer , che descrive la sequenza di caratteri che deve essere visualizzata dall'editor. Questo testo può essere modificato, rilevato e modificato in molti modi. Il modello di testo fornisce anche tipi per gli aspetti seguenti:

  • Servizio che associa testo ai file e gestisce la lettura e la scrittura nel file system.

  • Servizio differenze che rileva le differenze minime tra due sequenze di oggetti.

  • Sistema per descrivere il testo in un buffer in termini di subset del testo in altri buffer.

Il sottosistema del modello di testo è privo di concetti relativi all'interfaccia utente. Ad esempio, non è responsabile della formattazione del testo o del layout di testo e non ha alcuna conoscenza degli elementi decorativi visivi che possono essere associati al testo.

I tipi pubblici del sottosistema del modello di testo sono contenuti in Microsoft.VisualStudio.Text.Data.dll e Microsoft.VisualStudio.CoreUtility.dll, che dipendono solo dalla libreria di classi di base di .NET Framework e da Managed Extensibility Framework (MEF).

Sottosistema di visualizzazione testo

Il sottosistema di visualizzazione testo è responsabile della formattazione e della visualizzazione del testo. I tipi in questo sottosistema sono suddivisi in due livelli, a seconda che i tipi si basano su Windows Presentation Foundation (WPF). I tipi più importanti sono ITextView e IWpfTextView, che controllano il set di righe di testo da visualizzare, nonché il cursore, la selezione e le funzionalità per adornare il testo usando gli elementi dell'interfaccia utente WPF. Questo sottosistema fornisce anche margini intorno all'area di visualizzazione del testo. Questi margini possono essere estesi e possono contenere diversi tipi di contenuto ed effetti visivi. Esempi di margini sono le barre di scorrimento e le visualizzazioni dei numeri di riga.

I tipi pubblici del sottosistema di visualizzazione testo sono contenuti in Microsoft.VisualStudio.Text.UI.dll e Microsoft.VisualStudio.Text.UI.Wpf.dll. Il primo assembly contiene gli elementi indipendenti dalla piattaforma e il secondo contiene gli elementi specifici di WPF.

Sottosistema di classificazione

Il sottosistema di classificazione è responsabile della determinazione delle proprietà del tipo di carattere per il testo. Un classificatore suddivide il testo in classi diverse, ad esempio "parola chiave" o "commento". La mappa del formato di classificazione correla queste classi alle proprietà effettive del tipo di carattere, ad esempio "Blue Consolas 10 pt". Queste informazioni vengono utilizzate dalla visualizzazione testo quando formatta ed esegue il rendering del testo. L'assegnazione di tag, descritta più dettagliatamente più avanti in questo argomento, consente di associare i dati a intervalli di testo.

I tipi pubblici del sottosistema di classificazione sono contenuti in Microsoft.VisualStudio.Text.Logic.dll e interagiscono con gli aspetti visivi della classificazione, contenuti in Microsoft.VisualStudio.Text.UI.Wpf.dll.

Sottosistema operativo

Il sottosistema operativo definisce il comportamento dell'editor. Fornisce l'implementazione per i comandi dell'editor di Visual Studio e il sistema di annullamento.

Un'analisi più attenta del modello di testo e della visualizzazione testo

Modello di testo

Il sottosistema del modello di testo è costituito da raggruppamenti diversi di tipi di testo. Questi includono il buffer di testo, gli snapshot di testo e gli intervalli di testo.

Buffer di testo e snapshot di testo

L'interfaccia ITextBuffer rappresenta una sequenza di caratteri Unicode codificati tramite UTF-16, ovvero la codifica usata dal String tipo in .NET Framework. Un buffer di testo può essere salvato in modo permanente come documento del file system, ma non è obbligatorio.

Viene ITextBufferFactoryService utilizzato per creare un buffer di testo vuoto o un buffer di testo inizializzato da una stringa o da TextReader. Il buffer di testo può essere salvato in modo permanente nel file system come .ITextDocument

Qualsiasi thread può modificare il buffer di testo fino a quando un thread non assume la proprietà del buffer di testo chiamando TakeThreadOwnership. Successivamente, solo il thread può eseguire modifiche.

Un buffer di testo può passare attraverso molte versioni durante la sua durata. Viene generata una nuova versione ogni volta che il buffer viene modificato e un oggetto non modificabile ITextSnapshot rappresenta il contenuto di tale versione del buffer. Poiché gli snapshot di testo non sono modificabili, è possibile accedere a uno snapshot di testo in qualsiasi thread, senza restrizioni, anche se il buffer di testo che rappresenta continua a cambiare.

Snapshot di testo e righe di snapshot di testo

È possibile visualizzare il contenuto di uno snapshot di testo come sequenza di caratteri o come sequenza di righe. I caratteri e le righe sono entrambi indicizzati a partire da zero. Uno snapshot di testo vuoto contiene zero caratteri e una riga vuota. Una riga è delimitata da qualsiasi sequenza di caratteri di interruzione di riga Unicode valida o dall'inizio o dalla fine del buffer. I caratteri di interruzione di riga sono rappresentati in modo esplicito nello snapshot di testo e le interruzioni di riga in uno snapshot di testo non devono essere tutte uguali.

Nota

Per altre informazioni sui caratteri di interruzione di riga nell'editor di Visual Studio, vedere Codifiche e interruzioni di riga.

Una riga di testo è rappresentata da un ITextSnapshotLine oggetto , che può essere ottenuto da uno snapshot di testo per un determinato numero di riga o per una particolare posizione del carattere.

SnapshotPoint, SnapshotSpans e NormalizedSnapshotSpanCollections

Un SnapshotPoint oggetto rappresenta una posizione di carattere in uno snapshot. La posizione è garantita tra zero e la lunghezza dello snapshot. Un SnapshotSpan oggetto rappresenta un intervallo di testo in uno snapshot. La posizione Finale è garantita tra zero e la lunghezza dello snapshot. NormalizedSnapshotSpanCollection È costituito da un set di SnapshotSpan oggetti dello stesso snapshot.

Spans e NormalizedSpanCollections

Un Span oggetto rappresenta un intervallo che può essere applicato a un intervallo di testo in uno snapshot di testo. Le posizioni degli snapshot sono in base zero, quindi gli intervalli possono iniziare in qualsiasi posizione, incluso zero. La End proprietà di un intervallo è uguale alla somma della relativa Start proprietà e della relativa Length proprietà. Un Span oggetto non include il carattere indicizzato dalla End proprietà . Ad esempio, un intervallo con Start=5 e Length=3 ha End=8 e include i caratteri in corrispondenza delle posizioni 5, 6 e 7. La notazione per questo intervallo è [5..8).

Due intervalli si intersecano se hanno posizioni in comune, inclusa la posizione Finale. Pertanto, l'intersezione di [3, 5) e [2, 7) è [3, 5) e l'intersezione di [3, 5) e [5, 7) è [5, 5). Si noti che [5, 5) è un intervallo vuoto.

Due intervalli si sovrappongono se hanno posizioni in comune, ad eccezione della posizione Finale. Un intervallo vuoto non si sovrappone mai ad altri intervalli e la sovrapposizione di due intervalli non è mai vuota.

Un NormalizedSpanCollection è un elenco di intervalli nell'ordine delle proprietà Start degli intervalli. Nell'elenco vengono uniti intervalli sovrapposti o ad abutting. Ad esempio, dato il set di intervalli [5...9), [0..1), [3..6) e [9..10), l'elenco normalizzato di intervalli è [0...1), [3...10).

ITextEdit, TextVersion e notifiche di modifica del testo

Il contenuto di un buffer di testo può essere modificato usando un ITextEdit oggetto . La creazione di un oggetto di questo tipo (utilizzando uno dei CreateEdit() metodi di ITextBuffer) avvia una transazione di testo costituita da modifiche di testo. Ogni modifica è una sostituzione di un intervallo di testo nel buffer da una stringa. Le coordinate e il contenuto di ogni modifica vengono espressi in relazione allo snapshot del buffer all'avvio della transazione. L'oggetto ITextEdit regola le coordinate delle modifiche interessate da altre modifiche nella stessa transazione.

Si consideri, ad esempio, un buffer di testo contenente questa stringa:

abcdefghij

Applicare una transazione contenente due modifiche, una modifica che sostituisce l'intervallo in [2..4) usando il carattere X e una seconda modifica che sostituisce l'intervallo in [6..9) usando il carattere Y. Il risultato è questo buffer:

abXefYj

Le coordinate per la seconda modifica sono state calcolate rispetto al contenuto del buffer all'inizio della transazione, prima dell'applicazione della prima modifica.

Le modifiche apportate al buffer diventano effettive quando viene eseguito il commit dell'oggetto ITextEdit chiamando il relativo Apply() metodo. Se è presente almeno una modifica non vuota, viene creato un nuovo oggetto , viene creato un nuovo ITextVersion ITextSnapshot evento e viene generato un Changed evento. Ogni versione del testo ha uno snapshot di testo diverso. Uno snapshot di testo rappresenta lo stato completo del buffer di testo dopo una transazione di modifica, ma una versione di testo descrive solo le modifiche da uno snapshot a quello successivo. In generale, gli snapshot di testo devono essere usati una sola volta e quindi eliminati, mentre le versioni di testo devono rimanere attive per un certo periodo di tempo.

Una versione di testo contiene un oggetto INormalizedTextChangeCollection. Questa raccolta descrive le modifiche che, se applicate allo snapshot, producono lo snapshot successivo. Ogni ITextChange oggetto della raccolta contiene la posizione del carattere della modifica, la stringa sostituita e la stringa di sostituzione. La stringa sostituita è vuota per un inserimento di base e la stringa di sostituzione è vuota per un'eliminazione di base. La raccolta normalizzata è sempre null per la versione più recente del buffer di testo.

È possibile creare un'istanza di un ITextEdit solo oggetto per un buffer di testo in qualsiasi momento e tutte le modifiche di testo devono essere eseguite sul thread proprietario del buffer di testo (se la proprietà è stata richiesta). Una modifica di testo può essere abbandonata chiamando il Cancel relativo metodo o il relativo Dispose metodo.

ITextBuffer fornisce Insert()anche metodi , Delete()e Replace() simili a quelli trovati nell'interfaccia ITextEdit . La chiamata di questi ha lo stesso effetto della creazione di un ITextEdit oggetto, della chiamata simile e quindi dell'applicazione della modifica.

Punti di rilevamento e intervalli di rilevamento

Rappresenta ITrackingPoint una posizione di carattere in un buffer di testo. Se il buffer viene modificato in modo che causi lo spostamento della posizione del carattere, il punto di rilevamento viene spostato con esso. Ad esempio, se un punto di rilevamento fa riferimento alla posizione 10 in un buffer e cinque caratteri vengono inseriti all'inizio del buffer, il punto di rilevamento fa riferimento alla posizione 15. Se un inserimento si verifica esattamente nella posizione indicata dal punto di rilevamento, il relativo comportamento viene determinato dal relativo PointTrackingMode, che può essere Positive o Negative. Se la modalità di rilevamento è positiva, il punto di rilevamento fa riferimento allo stesso carattere, che si trova ora alla fine dell'inserimento. Se la modalità di rilevamento è negativa, il punto di rilevamento fa riferimento al primo carattere inserito nella posizione originale. Se il carattere nella posizione rappresentata da un punto di rilevamento viene eliminato, il punto di rilevamento passa al primo carattere che segue l'intervallo eliminato. Ad esempio, se un punto di rilevamento fa riferimento al carattere nella posizione 5 e i caratteri in corrispondenza delle posizioni da 3 a 6 vengono eliminati, il punto di rilevamento fa riferimento al carattere nella posizione 3.

Rappresenta ITrackingSpan un intervallo di caratteri anziché una sola posizione. Il suo comportamento è determinato dal relativo SpanTrackingMode. Se la modalità di rilevamento dell'intervallo è SpanTrackingMode.EdgeInclusive, l'intervallo di rilevamento aumenta per incorporare il testo inserito ai bordi. Se la modalità di rilevamento dell'intervallo è SpanTrackingMode.EdgeExclusive, l'intervallo di rilevamento non incorpora il testo inserito ai bordi. Tuttavia, se la modalità di rilevamento dell'intervallo è SpanTrackingMode.EdgePositive, un inserimento inserisce la posizione corrente verso l'inizio e se la modalità di rilevamento dell'intervallo è SpanTrackingMode.EdgeNegative, un inserimento spinge la posizione corrente verso la fine.

È possibile ottenere la posizione di un punto di rilevamento o l'intervallo di un intervallo di rilevamento per qualsiasi snapshot del buffer di testo a cui appartengono. I punti di rilevamento e gli intervalli di rilevamento possono essere referenziati in modo sicuro da qualsiasi thread.

Tipi di contenuto

I tipi di contenuto sono un meccanismo per definire diversi tipi di contenuto. Un tipo di contenuto può essere un tipo di file, ad esempio "text", "code", "binary" o un tipo di tecnologia, ad esempio "xml", "vb" o "c#". Ad esempio, la parola "using" è una parola chiave sia in C# che in Visual Basic, ma non in altri linguaggi di programmazione. Pertanto, la definizione di questa parola chiave sarebbe limitata ai tipi di contenuto "c#" e "vb".

I tipi di contenuto vengono usati come filtro per gli oggetti decorativi e altri elementi dell'editor. Molte funzionalità dell'editor e punti di estensione sono definite per ogni tipo di contenuto. Ad esempio, la colorazione del testo è diversa per i file di testo normale, i file XML e i file di codice sorgente di Visual Basic. I buffer di testo vengono in genere assegnati a un tipo di contenuto quando vengono creati e il tipo di contenuto di un buffer di testo può essere modificato.

I tipi di contenuto possono ereditare più tipi di contenuto da altri tipi di contenuto. ContentTypeDefinition Consente di specificare più tipi di base come elementi padre di un determinato tipo di contenuto.

Gli sviluppatori possono definire i propri tipi di contenuto e registrarli usando .IContentTypeRegistryService È possibile definire molte funzionalità dell'editor rispetto a un tipo di contenuto specifico usando .ContentTypeAttribute Ad esempio, i margini dell'editor, gli strumenti decorativi e i gestori del mouse possono essere definiti in modo che si applichino solo agli editor che visualizzano tipi di contenuto specifici.

Visualizzazione testo

La parte di visualizzazione del modello MVC (Model View Controller) definisce la visualizzazione testo, la formattazione della visualizzazione, gli elementi grafici come la barra di scorrimento e il cursore. Tutti gli elementi di presentazione dell'editor di Visual Studio sono basati su WPF.

Visualizzazioni di testo

L'interfaccia ITextView è una rappresentazione indipendente dalla piattaforma di una visualizzazione di testo. Viene usato principalmente per visualizzare documenti di testo in una finestra, ma può anche essere usato per altri scopi, ad esempio in una descrizione comando.

La visualizzazione testo fa riferimento a diversi tipi di buffer di testo. La TextViewModel proprietà fa riferimento a un ITextViewModel oggetto che punta a questi tre diversi buffer di testo: il buffer di dati, ovvero il buffer principale a livello di dati, il buffer di modifica, in cui viene eseguita la modifica e il buffer visivo, ovvero il buffer visualizzato nella visualizzazione testo.

Il testo viene formattato in base ai classificatori collegati al buffer di testo sottostante ed è decorato utilizzando i provider di strumenti decorativi collegati alla visualizzazione testo stessa.

Sistema di coordinate della visualizzazione testo

Il sistema di coordinate della visualizzazione testo specifica le posizioni nella visualizzazione testo. In questo sistema di coordinate, il valore x 0,0 corrisponde al bordo sinistro del testo visualizzato e il valore y 0,0 corrisponde al bordo superiore del testo visualizzato. La coordinata x aumenta da sinistra a destra e la coordinata y aumenta dall'alto verso il basso.

Non è possibile scorrere orizzontalmente una parte del testo visibile nella finestra di testo. Un riquadro di visualizzazione viene scorrevole orizzontalmente modificando la coordinata sinistra in modo che si muova rispetto alla superficie di disegno. Tuttavia, è possibile scorrere verticalmente un riquadro di visualizzazione solo modificando il testo di cui è stato eseguito il rendering, causando la generazione di un LayoutChanged evento.

Le distanze nel sistema di coordinate corrispondono ai pixel logici. Se la superficie di rendering del testo viene visualizzata senza una trasformazione di ridimensionamento, un'unità nel sistema di coordinate per il rendering del testo corrisponde a un pixel sullo schermo.

Margini

L'interfaccia ITextViewMargin rappresenta un margine e consente il controllo della visibilità del margine e delle relative dimensioni. Esistono quattro margini predefiniti, denominati "Top", "Left", "Right" e "Bottom" e collegati al bordo superiore, inferiore, sinistro o destro di una visualizzazione. Questi margini sono contenitori in cui è possibile posizionare altri margini. L'interfaccia definisce i metodi che restituiscono le dimensioni del margine e la visibilità di un margine. I margini sono elementi visivi che forniscono informazioni aggiuntive sulla visualizzazione testo a cui sono collegati. Ad esempio, il margine del numero di riga visualizza i numeri di riga per la visualizzazione testo. Il margine del glifo visualizza gli elementi dell'interfaccia utente.

L'interfaccia IWpfTextViewMarginProvider gestisce la creazione e la posizione dei margini. I margini possono essere ordinati rispetto ad altri margini. I margini con priorità più alta si trovano più vicino alla visualizzazione testo. Ad esempio, se sono presenti due margini sinistro, margine A e margine B e il margine B ha una priorità inferiore rispetto al margine A, il margine B viene visualizzato a sinistra del margine A.

Host visualizzazione testo

L'interfaccia IWpfTextViewHost contiene la visualizzazione testo ed eventuali decorazioni che accompagnano la visualizzazione, ad esempio barre di scorrimento. L'host di visualizzazione testo contiene anche margini collegati a un bordo della visualizzazione.

Testo formattato

Il testo visualizzato in una visualizzazione testo è costituito da ITextViewLine oggetti . Ogni riga di visualizzazione testo corrisponde a una riga di testo nella visualizzazione testo. Le righe lunghe nel buffer di testo sottostante possono essere parzialmente oscurate (se il ritorno a capo automatico non è abilitato) o suddivise in più righe di visualizzazione testo. L'interfaccia ITextViewLine contiene metodi e proprietà per il mapping tra coordinate e caratteri e per le decorazioni che possono essere associate alla linea.

ITextViewLine gli oggetti vengono creati usando un'interfaccia IFormattedLineSource . Se si è interessati solo al testo attualmente visualizzato nella visualizzazione, è possibile ignorare l'origine di formattazione. Se si è interessati al formato di testo non visualizzato nella visualizzazione (ad esempio, per supportare un taglio e incolla rtf), è possibile usare IFormattedLineSource per formattare il testo in un buffer di testo.

La visualizzazione testo formatta una ITextSnapshotLine alla volta.

Funzionalità dell'editor

Le funzionalità dell'editor sono progettate in modo che la definizione della funzionalità sia separata dalla relativa implementazione. L'editor include queste funzionalità:

  • Tag e classificatori

  • Ornamenti

  • Projection

  • struttura

  • Tasti di scelta rapida e mouse

  • Operazioni e primitive

  • IntelliSense

Tag e classificatori

I tag sono marcatori associati a un intervallo di testo. Possono essere presentati in modi diversi, ad esempio usando la colorazione del testo, le sottolineature, la grafica o i popup. I classificatori sono un tipo di tag.

Altri tipi di tag sono TextMarkerTag destinati all'evidenziazione del testo, OutliningRegionTag alla struttura e ErrorTag agli errori di compilazione.

Tipi di classificazione

Un'interfaccia IClassificationType rappresenta una classe di equivalenza, ovvero una categoria astratta di testo. I tipi di classificazione possono ereditare più tipi di classificazione da altri tipi di classificazione. Ad esempio, le classificazioni del linguaggio di programmazione possono includere "keyword", "comment" e "identifier", che ereditano tutti da "code". I tipi di classificazione del linguaggio naturale possono includere "sostantivo", "verbo" e "aggettivo", che ereditano tutti da "linguaggio naturale".

Classificazioni

Una classificazione è un'istanza di un particolare tipo di classificazione, in genere su un intervallo di testo. Un ClassificationSpan oggetto viene utilizzato per rappresentare una classificazione. Un intervallo di classificazione può essere considerato come un'etichetta che copre un intervallo di testo specifico e indica al sistema che questo intervallo di testo è di un particolare tipo di classificazione.

Classificatori

Un IClassifier è un meccanismo che suddivide il testo in un set di classificazioni. I classificatori devono essere definiti per tipi di contenuto specifici e creare un'istanza per buffer di testo specifici. I client devono implementare IClassifier per partecipare alla classificazione del testo.

Aggregatori di classificatori

Un aggregatore di classificatore è un meccanismo che combina tutti i classificatori per un buffer di testo in un solo set di classificazioni. Ad esempio, sia un classificatore C# che un classificatore di linguaggio inglese possono creare classificazioni su un commento in un file C#. Prendere in considerazione questo commento:

// This method produces a classifier

Un classificatore C# potrebbe etichettare l'intero intervallo come commento e il classificatore del linguaggio inglese potrebbe classificare "produce" come "verbo" e "metodo" come "sostantivo". L'aggregatore produce un set di classificazioni non sovrapposte e il tipo di set si basa su tutti i contributi.

Un aggregatore di classificatore è anche un classificatore perché suddivide il testo in un set di classificazioni. L'aggregatore di classificatore garantisce inoltre che non siano presenti classificazioni sovrapposte e che le classificazioni siano ordinate. I singoli classificatori sono liberi di restituire qualsiasi set di classificazioni, in qualsiasi ordine e sovrapposizione in qualsiasi modo.

Formattazione della classificazione e colorazione del testo

La formattazione del testo è un esempio di funzionalità basata sulla classificazione del testo. Viene usato dal livello di visualizzazione testo per determinare la visualizzazione del testo in un'applicazione. L'area di formattazione del testo dipende da WPF, ma la definizione logica delle classificazioni non viene eseguita.

Un formato di classificazione è un set di proprietà di formattazione per un tipo di classificazione specifico. Questi formati ereditano dal formato dell'elemento padre del tipo di classificazione.

Un IClassificationFormatMap oggetto è una mappa da un tipo di classificazione a un set di proprietà di formattazione del testo. L'implementazione della mappa di formato nell'editor gestisce tutte le esportazioni dei formati di classificazione.

Ornamenti

Gli oggetti decorativi sono effetti grafici che non sono direttamente correlati al tipo di carattere e al colore dei caratteri nella visualizzazione testo. Ad esempio, la sottolineatura ondulata rossa usata per contrassegnare il codice non compilato in molti linguaggi di programmazione è uno strumento decorativo incorporato e le descrizioni comando sono elementi decorativi popup. Gli strumenti decorativi sono derivati da UIElement e implementano ITag. Due tipi specializzati di tag di adornamento sono , SpaceNegotiatingAdornmentTagper gli oggetti decorativi che occupano lo stesso spazio del testo in una visualizzazione e , ErrorTagper la sottolineatura ondulata.

Gli oggetti decorativi incorporati sono elementi grafici che fanno parte della visualizzazione testo formattata. Sono organizzati in diversi livelli di ordine Z. Esistono tre livelli predefiniti, come indicato di seguito: testo, cursore e selezione. Tuttavia, gli sviluppatori possono definire più livelli e metterli in ordine rispetto l'uno all'altro. I tre tipi di adornamenti incorporati sono strumenti decorativi relativi al testo (che si spostano quando il testo viene spostato e vengono eliminati quando il testo viene eliminato), gli adornamenti relativi alla visualizzazione (che hanno a che fare con parti non di testo della visualizzazione) e gli adornamenti controllati dal proprietario (lo sviluppatore deve gestire il posizionamento).

Gli elementi decorativi popup sono grafici visualizzati in una piccola finestra sopra la visualizzazione testo, ad esempio descrizioni comando.

Projection

La proiezione è una tecnica per costruire un tipo diverso di buffer di testo che non archivia effettivamente il testo, ma combina invece il testo da altri buffer di testo. Ad esempio, un buffer di proiezione può essere usato per concatenare il testo da due altri buffer e presentare il risultato come se si trova in un solo buffer o per nascondere parti del testo in un buffer. Un buffer di proiezione può fungere da buffer di origine in un altro buffer di proiezione. Un set di buffer correlati alla proiezione può essere costruito per riorganizzare il testo in molti modi diversi. Un set di questo tipo è noto anche come grafo del buffer. La funzionalità di struttura del testo di Visual Studio viene implementata usando un buffer di proiezione per nascondere il testo compresso e l'editor di Visual Studio per ASP.NET pagine usa la proiezione per supportare linguaggi incorporati, ad esempio Visual Basic e C#.

Un IProjectionBuffer oggetto viene creato utilizzando IProjectionBufferFactoryService. Un buffer di proiezione è rappresentato da una sequenza ordinata di oggetti noti come intervalli di ITrackingSpan origine. Il contenuto di questi intervalli viene presentato come una sequenza di caratteri. I buffer di testo da cui vengono disegnati gli intervalli di origine sono buffer di origine denominati. I client di un buffer di proiezione non devono essere consapevoli che differiscono da un buffer di testo ordinario.

Il buffer di proiezione è in ascolto degli eventi di modifica del testo nei buffer di origine. Quando il testo in un intervallo di origine cambia, il buffer di proiezione esegue il mapping delle coordinate di testo modificate alle proprie coordinate e genera eventi di modifica del testo appropriati. Si considerino, ad esempio, i buffer di origine A e B con questi contenuti:

A: ABCDE
B: vwxyz

Se il buffer di proiezione P è formato da due intervalli di testo, uno con tutto il buffer A e l'altro con tutto il buffer B, P ha il contenuto seguente:

P: ABCDEvwxyz

Se la sottostringa xy viene eliminata dal buffer B, il buffer P genera un evento che indica che i caratteri nelle posizioni 7 e 8 sono stati eliminati.

Il buffer di proiezione può anche essere modificato direttamente. Propaga le modifiche ai buffer di origine appropriati. Ad esempio, se una stringa viene inserita nel buffer P nella posizione 6 (la posizione originale del carattere "v"), l'inserimento viene propagato nel buffer B nella posizione 1.

Esistono restrizioni per gli intervalli di origine che contribuiscono a un buffer di proiezione. Gli intervalli di origine potrebbero non sovrapporsi; una posizione in un buffer di proiezione non può eseguire il mapping a più di una posizione in qualsiasi buffer di origine e una posizione in un buffer di origine non può eseguire il mapping a più di una posizione in un buffer di proiezione. Non sono consentite circolarità nella relazione di buffer di origine.

Gli eventi vengono generati quando il set di buffer di origine per un buffer di proiezione cambia e quando il set di intervalli di origine cambia. Un buffer di elisione è un tipo speciale di buffer di proiezione. Viene usato principalmente per strutturare e per le operazioni che espandono e comprimeno blocchi di testo. Un buffer di elisione si basa su un solo buffer di origine e gli intervalli nel buffer di elisione devono essere ordinati come sono ordinati nel buffer di origine.

Grafico del buffer

L'interfaccia IBufferGraph abilita il mapping in un grafico di buffer di proiezione. Tutti i buffer di testo e i buffer di proiezione vengono raccolti in un grafico aciclico diretto, in modo analogo all'albero della sintassi astratta prodotto da un compilatore di linguaggio. Il grafico è definito dal buffer superiore, che può essere qualsiasi buffer di testo. Il grafico del buffer può eseguire il mapping da un punto nel buffer superiore a un punto in un buffer di origine o da un intervallo nel buffer superiore a un set di intervalli in un buffer di origine. Analogamente, può eseguire il mapping di un punto o di un intervallo da un buffer di origine a un punto nel buffer superiore. I grafici del buffer vengono creati usando .IBufferGraphFactoryService

Eventi e buffer di proiezione

Quando viene modificato un buffer di proiezione, le modifiche vengono inviate dal buffer di proiezione ai buffer che ne dipendono. Dopo aver modificato tutti i buffer, vengono generati eventi di modifica del buffer, a partire dal buffer più profondo.

struttura

La struttura è la possibilità di espandere o comprimere blocchi di testo diversi in una visualizzazione testo. La struttura è definita come un tipo di ITag, nello stesso modo in cui vengono definite le decorazioni. È OutliningRegionTag un tag che definisce un'area di testo che può essere espansa o compressa. Per usare la struttura, è necessario importare per IOutliningManagerService ottenere un oggetto IOutliningManager. Il gestore struttura enumera, comprime ed espande i diversi blocchi, rappresentati come ICollapsible oggetti, e genera di conseguenza eventi.

Associazioni del mouse

Le associazioni del mouse collegano i movimenti del mouse a comandi diversi. Le associazioni del mouse vengono definite usando le IMouseProcessorProviderassociazioni di tasti e vengono definite usando un oggetto IKeyProcessorProvider. Crea automaticamente un'istanza IWpfTextViewHost di tutti i binding e li connette agli eventi del mouse nella visualizzazione.

L'interfaccia IMouseProcessor contiene gestori eventi pre-process e post-process per eventi del mouse diversi. Per gestire uno degli eventi, è possibile eseguire l'override di alcuni dei metodi in MouseProcessorBase.

Operazioni dell'editor

Le operazioni dell'editor possono essere usate per automatizzare l'interazione con l'editor, per scopi di script o di altro tipo. È possibile importare per IEditorOperationsFactoryService accedere alle operazioni in un determinato ITextViewoggetto . È quindi possibile utilizzare questi oggetti per modificare la selezione, scorrere la visualizzazione o spostare il cursore in parti diverse della visualizzazione.

IntelliSense

IntelliSense supporta il completamento dell'istruzione, la Guida alla firma (nota anche come informazioni sui parametri), informazioni rapide e lampadine.

Il completamento dell'istruzione fornisce elenchi popup di potenziali completamenti per nomi di metodi, elementi XML e altri elementi di codifica o markup. In generale, un movimento utente richiama una sessione di completamento. La sessione visualizza l'elenco dei potenziali completamenti e l'utente può selezionarne uno o ignorare l'elenco. è ICompletionBroker responsabile della creazione e dell'attivazione di ICompletionSession. Calcola ICompletionSource l'oggetto CompletionSet degli elementi di completamento per la sessione.

Risoluzione dei problemi di Importazione/Esportazione: accedere al log degli errori di composizione MEF

È possibile che si verifichino problemi se si tenta di importare un elemento che non esiste nell'installazione corrente di Visual Studio o se si crea erroneamente l'importazione o l'esportazione. Il modo principale per trovare e risolvere questi problemi consiste nel fare riferimento al log degli errori di composizione mef (Managed Extensibility Framework), archiviato in %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err.