Reformater code (managed de package)
Dans le code source de Visual Studio peut être remis en forme en normalisant l'utilisation des mises en retrait et un espace blanc. Cela peut inclure insérer ou supprimer des espaces ou des tabulations au début de chaque ligne, ajouter des lignes entre les lignes, ou remplacer les espaces et des tabulations ou des onglets avec des espaces.
Notes
Remarque insertion ou suppression de caractères de saut de ligne peut affecter les marques telles que les points d'arrêt et des signets, mais l'ajout ou des espaces ou des tabulations de supprimer n'affecte pas le.
Les utilisateurs peuvent commencer une opération de différer en formee par sélectionner Mettre la sélection en forme ou document de format le menu pour Avancé dans le menu Edition. Une opération de différer en formee peut également être levée lorsqu'un extrait de code ou un caractère particulier est inséré. Par exemple, lorsque vous tapez une accolade fermante en c#, tout entre l'accolade ouvrante correspondante et les accolades proche est automatiquement mis en retrait au niveau approprié.
Lorsque Visual Studio envoie la commande de Mettre la sélection en forme ou de mettez en forme le document au service de langage, la classe d' ViewFilter appelle la méthode d' ReformatSpan dans la classe d' Source . Pour prendre en charge vous mettre en forme doit substituer la méthode d' ReformatSpan par votre propre code de mise en forme.
Activer la prise en charge de reformater
Pour prendre en charge la mise en forme, le paramètre d' EnableFormatSelection d' ProvideLanguageServiceAttribute doit être défini à true lorsque vous enregistrez votre VSPackage. Cela définit la propriété d' EnableFormatSelection à true. La méthode d' CanReformat retourne la valeur de cette propriété. S'il retourne la valeur true, la classe d' ViewFilter appelle l' ReformatSpan.
Implémenter la remise en forme
Pour implémenter la remise en forme, vous devez dériver une classe de la classe d' Source et substituer la méthode d' ReformatSpan . L'objet d' TextSpan décrit l'étendue pour mettre en forme et l'objet d' EditArray détient les modifications effectuées dans l'étendue. Notez que cette étendue peut être le document entier. Toutefois, étant donné qu'il existe probablement pour être plusieurs modifications apportées à l'étendue, toutes les modifications doivent être réversibles en une seule étape. Pour ce faire, incluez les modifications apportées à un objet d' CompoundAction (consultez la section « utilisation de CompoundAction classe »).
Exemple
L'exemple suivant vérifie il existe un espace unique après chaque virgule dans la sélection, à moins que la virgule est suivie par un onglet ou soit à la fin de la ligne. les espaces à droite après la dernière virgule dans une ligne sont supprimés. Consultez la section « utilisation de CompoundAction classe » de cette rubrique pour voir comment cette méthode est appelée de la méthode d' 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();
}
}
}
}
Utilisation de la classe CompoundAction
Tout le remettre en forme effectuée sur une section de code doit être réversible en une seule étape. Cette opération peut être effectuée à l'aide d'une classe d' CompoundAction . Cette classe encapsule un ensemble de modifications dans la mémoire tampon de texte en une seule modification.
Exemple
Voici un exemple d'utilisation de la classe d' CompoundAction . Consultez l'exemple dans « implémenter la prise en charge de la mise en forme » la section dans cette rubrique pour obtenir un exemple de la méthode d' 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
}
}
}
}