Riformattando codice (managed package Framework)
In Visual Studio il codice sorgente può essere riformattato normalizzando l'utilizzo dei rientri e spazio vuoto. Ciò può includere l'inserimento o rimuovere gli spazi o le tabulazioni all'inizio di ogni riga, l'aggiunta di nuove righe tra le righe, o sostituire gli spazi con tabulazioni o tabulazioni con spazi.
Nota
Nota che inserisce o che elimina i caratteri di nuova riga può influire sui marcatori come punti di interruzione e segnalibri, ma l'aggiunta o spazi o tabulazioni rimuovere non influisce sui marcatori.
Gli utenti possono avviare un'operazione di formattazione selezionando selezione di formato o documento di formato dal menu di Avanzate scegliere dal menu di Modifica . Un'operazione di formattazione può essere attivata quando un frammento di codice o un carattere specifico viene inserito. Ad esempio, quando si digita una parentesi graffa di chiusura in c#, tutto tra la parentesi graffa aperta corrispondente e la parentesi graffa di chiusura viene automaticamente impostato un rientro al livello appropriato.
Quando Visual Studio invia il comando di documento di formato o di selezione di formato al servizio di linguaggio, la classe di ViewFilter chiama il metodo di ReformatSpan nella classe di Source . Per supportare formattarvi necessario eseguire l'override del metodo di ReformatSpan e fornire per contenere il codice di formattazione.
Abilitare il supporto per la formattazione
Per supportare la formattazione, il parametro di EnableFormatSelection di ProvideLanguageServiceAttribute deve essere impostato su true quando si registra il package VS. Questo imposta la proprietà di EnableFormatSelection a true. il metodo di CanReformat restituisce il valore di questa proprietà. If it returns true, the ViewFilter class calls the ReformatSpan.
Implementare la formattazione
Per implementare la formattazione, è necessario derivare una classe dalla classe di Source ed eseguire l'override del metodo di ReformatSpan . L'oggetto di TextSpan vengono descritti l'intervallo per formattare e l'oggetto di EditArray contenuta le modifiche apportate nell'intervallo. Si noti che questo intervallo può essere l'intero documento. Tuttavia, poiché è probabile essere più modifiche apportate all'intervallo, tutte le modifiche devono essere reversibili in una singola azione. A tale scopo, eseguire il wrapping di tutte le modifiche in un oggetto di CompoundAction (vedere “using la sezione della classe di CompoundAction„ in questo argomento).
Esempio
Nell'esempio verificare la presenza di un singolo spazio dopo ogni virgola nella selezione, a meno che la virgola non sia seguito da una scheda o si trova alla fine della riga. Gli spazi finali dopo l'ultimo virgola in una riga vengono eliminati. Vedere “using la sezione della classe di CompoundAction„ in questo argomento per vedere come questo metodo viene chiamato dal metodo di ReformatSpan .
using Microsoft.VisualStudio.Package;
using Microsoft VisualStudio.TextManager.Interop;
namespace MyLanguagePackage
{
class MySource : Source
{
private void DoFormatting(EditArray mgr, TextSpan span)
{
// Make sure there is one space after every comma unless followed
// by a tab or comma is at end of line.
IVsTextLines pBuffer = GetTextLines();
if (pBuffer != null)
{
int startIndex = span.iStartIndex;
int endIndex = 0;
string line = "";
// Loop over all lines in span
for (int i = span.iStartLine; i <= span.iEndLine; i++)
{
if (i < span.iEndLine)
{
pBuffer.GetLengthOfLine(i, out endIndex);
}
else
{
endIndex = span.iEndIndex;
}
pBuffer.GetLineText(i, startIndex, i, endIndex, out line);
if (line.Length > 0)
{
int index = 0;
// Loop over all commas in line
while ((index = line.IndexOf(',', index)) != -1)
{
int spaceIndex = index + 1;
// Determine how many spaces after comma
while (spaceIndex < line.Length && line[spaceIndex] == ' ')
{
++spaceIndex;
}
int spaceCount = spaceIndex - (index + 1);
string replacementText = " ";
bool fDoEdit = true;
TextSpan editTextSpan = new TextSpan();
editTextSpan.iStartLine = i;
editTextSpan.iEndLine = i;
editTextSpan.iStartIndex = index + 1;
if (spaceIndex == line.Length)
{
if (spaceCount > 0)
{
// Delete spaces after a comma at end of line
editTextSpan.iEndIndex = spaceIndex;
replacementText = "";
}
else
{
// Otherwise, do not add spaces if comma is
// at end of line.
fDoEdit = false;
}
}
else if (spaceCount == 0)
{
if (spaceIndex < line.Length && line[spaceIndex] == '\t')
{
// Do not insert space if a tab follows
// a comma.
fDoEdit = false;
}
else
{
// No space after comma so add a space.
editTextSpan.iEndIndex = index + 1;
}
}
else if (spaceCount > 1)
{
// More than one space after comma, replace
// with a single space.
editTextSpan.iEndIndex = spaceIndex;
}
else
{
// Single space after a comma and not at end
// of the line, leave it alone.
fDoEdit = false;
}
if (fDoEdit)
{
// Add edit operation
mgr.Add(new EditSpan(editTextSpan, replacementText));
}
index = spaceIndex;
}
}
startIndex = 0; // All subsequent lines start at 0
}
// Apply all edits
mgr.ApplyEdits();
}
}
}
}
Utilizzando la classe di CompoundAction
Qualsiasi formattazione eseguito su una sezione di codice dovrebbe essere reversibile in una singola azione. Questa operazione può essere eseguita utilizzando una classe di CompoundAction . Questa classe esegue il wrapping di un set di operazioni di modifica nel buffer di testo in una singola operazione di modifica.
Esempio
Di seguito è riportato un esempio di come utilizzare la classe di CompoundAction . Vedere l'esempio “quando si implementa il supporto per formattare la sezione„ in questo argomento per un esempio del metodo di DoFormatting .
using Microsoft.VisualStudio.Package;
using Microsoft VisualStudio.TextManager.Interop;
namespace MyLanguagePackage
{
class MySource : Source
{
public override void ReformatSpan(EditArray mgr, TextSpan span)
{
string description = "Reformat code";
CompoundAction ca = new CompoundAction(this, description);
using (ca)
{
ca.FlushEditActions(); // Flush any pending edits
DoFormatting(mgr, span); // Format the span
}
}
}
}
Vedere anche
Altre risorse
Funzionalità del servizio di linguaggio (managed package Framework)