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.
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.
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.
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!)
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.
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 {
//...
};
Je comprends le problème lorsqu'il existe des espaces de noms imbriqués. J'avais l'habitude d'emballer tous les namespace
s 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é.