web-dev-qa-db-fra.com

Existe-t-il un moyen de faire cesser l'indentation des espaces de noms par Visual Studio?

Visual Studio continue d'essayer d'indenter le code dans les espaces de noms.

Par exemple:

namespace Foo
{
   void Bar();

   void Bar()
   {

   }

}

Maintenant, si je le désindente manuellement, cela reste ainsi. Mais malheureusement, si j'ajoute quelque chose juste avant void Bar(); - comme un commentaire - VS continuera d'essayer de le mettre en retrait.

C'est tellement ennuyeux que, fondamentalement, pour cette seule raison, je n'utilise presque jamais d'espaces de noms en C++. Je ne comprends pas pourquoi il essaie de les mettre en retrait (quel est l'intérêt de mettre en retrait 1 ou même 5 onglets le fichier entier?), Ou comment l'arrêter.

Existe-t-il un moyen d'arrêter ce comportement? Une option de configuration, un complément, un paramètre de registre, même un hack qui modifie devenv.exe directement.

63
Thomas Bonini

Voici une macro qui pourrait vous aider. Il supprimera l'indentation s'il détecte que vous créez actuellement un namespace. Ce n'est pas parfait mais semble fonctionner jusqu'à présent.

Public Sub aftekeypress(ByVal key As String, ByVal sel As TextSelection, ByVal completion As Boolean) _
        Handles TextDocumentKeyPressEvents.AfterKeyPress
    If (Not completion And key = vbCr) Then
        'Only perform this if we are using smart indent
        If DTE.Properties("TextEditor", "C/C++").Item("IndentStyle").Value = 2 Then
            Dim textDocument As TextDocument = DTE.ActiveDocument.Object("TextDocument")
            Dim startPoint As EditPoint = sel.ActivePoint.CreateEditPoint()
            Dim matchPoint As EditPoint = sel.ActivePoint.CreateEditPoint()
            Dim findOptions As Integer = vsFindOptions.vsFindOptionsMatchCase + vsFindOptions.vsFindOptionsMatchWholeWord + vsFindOptions.vsFindOptionsBackwards
            If startPoint.FindPattern("namespace", findOptions, matchPoint) Then
                Dim lines = matchPoint.GetLines(matchPoint.Line, sel.ActivePoint.Line)
                ' Make sure we are still in the namespace {} but nothing has been typed
                If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace[\s\w]+)?[\s\{]+$") Then
                    sel.Unindent()
                End If
            End If
        End If
    End If
End Sub

Comme il fonctionne tout le temps, vous devez vous assurer que vous installez la macro à l'intérieur de votre élément de projet EnvironmentEvents à l'intérieur de MyMacros. Vous ne pouvez accéder à ce module que dans l'explorateur de macros (Outils-> Macros-> Explorateur de macros).

Une remarque, il ne prend pas actuellement en charge les espaces de noms "compressés" tels que

namespace A { namespace B {
...
}
}

[~ # ~] modifier [~ # ~]

Pour prendre en charge des espaces de noms "compressés" tels que l'exemple ci-dessus et/ou prendre en charge les commentaires après l'espace de noms, tels que namespace A { /* Example */, vous pouvez essayer d'utiliser la ligne suivante à la place:

 If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[\s]*(namespace.+)?[\s\{]+$") Then

Je n'ai pas encore eu l'occasion de le tester, mais cela semble fonctionner.

13
Rod

Comme le souligne KindDragon, Visual Studio 2013 Update 2 a une option pour arrêter le retrait.

Vous pouvez décocher OUTILS -> Options -> Éditeur de texte -> C/C++ -> Formatage -> Retrait -> Retrait du contenu de l'espace de noms.

45
user64953

N'insérez rien avant la première ligne de code. Vous pouvez essayer l'approche suivante pour insérer une ligne de code nulle (cela semble fonctionner dans VS2005):

namespace foo
{; // !<---
void Test();
}

Cela semble supprimer l'indentation, mais les compilateurs peuvent émettre des avertissements et les réviseurs/responsables du code peuvent être surpris! (Et à juste titre, dans le cas habituel!)

30
bacar

Probablement pas ce que vous vouliez entendre, mais beaucoup de gens contournent cela en utilisant des macros:

 # définir BEGIN_NAMESPACE (x) espace de noms x {
 # définir END_NAMESPACE} 

Cela semble stupide, mais vous seriez surpris du nombre d'en-têtes du système qui utilisent cela. (L'implémentation stl de la glibc, par exemple, a _GLIBCXX_BEGIN_NAMESPACE() pour cela.)

En fait, je préfère cette façon, car j'ai toujours tendance à grincer des dents lorsque je vois des lignes non en retrait suivant un {. C'est juste moi cependant.

13
Ken Simon

Vous pouvez également transmettre vos types (ou autre) à l'intérieur de l'espace de noms, puis les implémenter à l'extérieur comme ceci:

namespace test {
    class MyClass;
}

class test::MyClass {
//...
};
7
metator

Je comprends le problème lorsqu'il existe des espaces de noms imbriqués. J'avais l'habitude d'emballer tous les namespaces sur une seule ligne pour éviter l'indentation multiple. Cela laissera un niveau, mais ce n'est pas aussi mauvais que de nombreux niveaux. Cela fait si longtemps que je n'ai pas utilisé VS que je me souviens à peine de ces jours.

namespace outer { namespace middle { namespace inner {
    void Test();
    .....
}}}

Visual Studio 2017

Menu d'indication d'espace de noms VS2017

Vous pouvez accéder à ce paramètre "Contenu de l'espace de noms en retrait" sous Outils-> Options puis Editeur de texte-> C/C++ -> Formatage-> Indentation. C'est profondément dans les menus mais extrêmement utile une fois trouvé.

0
Michael Hall