Concetti di estendibilità dell'editor

Questo articolo descrive il modello a oggetti di estendibilità che rappresenta l'editor di Visual Studio e il documento di testo aperto per la modifica. Per un'introduzione all'uso della funzionalità di estensione dell'editor, vedere Usare l'estendibilità dell'editor di Visual Studio.

Il modello a oggetti di estendibilità di Visual Studio Editor è costituito da alcune parti integrali. Questo articolo illustra ITextViewSnapshot, ITextDocumentSnapshot e altre rappresentazioni astratte dell'intero documento, nonché Position e Span, che rappresentano rispettivamente la posizione e gli intervalli di testo.

ITextViewSnapshot

ITextViewSnapshot contiene le informazioni sull'URI e sulla versione necessarie per acquisire un ITextDocumentSnapshot e alcune proprietà della visualizzazione testo, ad esempio le selezioni.

  • Questo oggetto non è modificabile e non cambierà mai dopo la creazione.
  • È possibile usare ITextViewSnapshot.GetTextDocumentAsync() per ottenere il contenuto dal documento. La chiamata a questo metodo è costosa e deve essere eseguita solo se è necessario il contenuto del documento.
  • ITextViewSnapshot non può essere modificato direttamente. Tutte le modifiche vengono richieste tramite mutazione. Vedere Apportare modifiche in un documento di testo da un'estensione.

ITextDocumentSnapshot

ITextDocumentSnapshot contiene il contenuto del documento di testo da un punto nel tempo o versione.

Se si ha familiarità con le estensioni legacy di Visual Studio, ITextDocumentSnapshot è quasi uguale a ITextSnapshot e supporta la maggior parte degli stessi metodi per l'accesso al testo.

Procedure consigliate:

  • È possibile usare Position e Span per rappresentare le sottostringhe nel documento senza copiare o allocare stringhe in sospeso. La maggior parte delle API opera in termini di queste primitive.
  • È possibile usare la sintassi dell'indicizzatore, textDocument[0], per leggere il carattere in base al carattere nel documento senza copiarlo in una stringa.
  • Se è necessario creare una stringa come per l'uso come chiave del dizionario, usare l'overload che accetta un Spanoggetto per evitare di creare una stringa di recapito di grandi dimensioni dall'intera riga o documento.
  • Evitare di presupporre che righe o documenti siano brevi. Molte lingue si minificano in righe enormi o utilizzano file molto grandi
    • ITextDocumentSnapshot fa riferimento a strutture di dati di grandi dimensioni che possono utilizzare memoria se è archiviata una versione sufficientemente recente. La procedura consigliata consiste nell'aggiornare periodicamente le posizioni e gli intervalli archiviati a lungo termine alla versione più recente del documento tramite il relativo TranslateTo() metodo in modo che la versione precedente ITextDocumentSnapshot possa essere sottoposto a Garbage Collection.

Position

Rappresenta una posizione all'interno del documento di testo. Invece delle int posizioni, il tipo Position è a conoscenza dell'oggetto ITextDocumentSnapshot da cui proviene e supporta GetChar() per ottenere direttamente il carattere in quel punto.

Se si ha familiarità con le estensioni legacy di Visual Studio, Position è quasi identico a SnapshotPoint e supporta la maggior parte degli stessi metodi.

Span

Rappresenta una sottostringa contigua di caratteri all'interno di un oggetto ITextDocumentSnapshot. Anziché una stringa creata con string.Substring() o ITextDocumentSnapshot.CopyToString(), la creazione di un oggetto Span non richiede allocazioni o memoria aggiuntiva. In seguito è possibile chiamare Span.GetText() per comprenderlo in una stringa in modo posticipato.

Se si ha familiarità con le estensioni legacy di Visual Studio, Position è quasi identico a SnapshotSpan e supporta la maggior parte degli stessi metodi.

Esaminare il codice di esempio per una semplice estensione basata su editor: