c++ - sale - sangrado de nariz en niños
¿Hay alguna manera de hacer que Visual Studio deje de sangrar espacios de nombres? (7)
Visual Studio sigue intentando sangrar el código dentro de los espacios de nombres.
Por ejemplo:
namespace Foo
{
void Bar();
void Bar()
{
}
}
Ahora, si lo deshago manualmente, se mantendrá así. Pero desafortunadamente si agrego algo justo antes de void Bar();
- como un comentario - VS seguirá intentando sangrarlo.
Esto es tan molesto que, básicamente, debido a esta única razón, casi nunca uso espacios de nombres en C ++. No puedo entender por qué trata de sangrarlos (¿cuál es el sentido de sangrar 1 o incluso 5 pestañas de todo el archivo ?), O cómo hacer que se detenga.
¿Hay alguna manera de detener este comportamiento? Una opción de configuración, un complemento, una configuración de registro, incluso un truco que modifica devenv.exe directamente.
Aquí hay una macro que podría ayudarte. Eliminará la sangría si detecta que está creando actualmente un namespace
. No es perfecto, pero parece funcionar hasta ahora.
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
Dado que se ejecuta todo el tiempo, debe asegurarse de que está instalando la macro dentro de su elemento de proyecto EnvironmentEvents
dentro de MyMacros. Solo puede acceder a este módulo en el Explorador de macros (Herramientas-> Macros-> Explorador de macros).
Una nota, actualmente no admite espacios de nombres "empaquetados" como
namespace A { namespace B {
...
}
}
EDITAR
Para admitir espacios de nombres "empaquetados" como el ejemplo anterior y / o comentarios de soporte después del espacio de nombres, como el namespace A { /* Example */
, puede intentar usar la siguiente línea:
If System.Text.RegularExpressions.Regex.IsMatch(lines, "^[/s]*(namespace.+)?[/s/{]+$") Then
No he tenido la oportunidad de probarlo mucho todavía, pero parece estar funcionando.
Como KindDragon señala, Visual Studio 2013 Update 2 tiene una opción para detener la sangría.
Puede desmarcar HERRAMIENTAS -> Opciones -> Editor de texto -> C / C ++ -> Formatear -> Sangría -> Aplicar sangría al contenido del espacio de nombres.
Entiendo el problema cuando hay espacios de nombres anidados. Solía empaquetar todos los namespace
en una sola línea para evitar la sangría múltiple. Dejará un nivel, pero eso no es tan malo como muchos niveles. Ha pasado tanto tiempo desde que utilicé VS que apenas recuerdo esos días.
namespace outer { namespace middle { namespace inner {
void Test();
.....
}}}
Probablemente no sea lo que quería escuchar, pero muchas personas lo solucionan al usar macros:
#define BEGIN_NAMESPACE(x) namespace x { #define END_NAMESPACE }
Suena tonto, pero te sorprendería cuántos encabezados del sistema usan esto. (La implementación stl de glibc, por ejemplo, tiene _GLIBCXX_BEGIN_NAMESPACE()
para esto).
De hecho prefiero de esta manera, porque siempre tiendo a encogerme cuando veo líneas sin sangría después de {
. Aunque soy solo yo.
Simplemente no inserte nada antes de la primera línea de código. Puede probar el siguiente enfoque para insertar una línea nula de código (parece funcionar en VS2005):
namespace foo
{; // !<---
void Test();
}
Esto parece suprimir la sangría, pero los compiladores pueden emitir advertencias y los revisores / encargados del código pueden sorprenderse. (¡Y con razón, en el caso habitual!)
También puede reenviar declarar sus tipos (o lo que sea) dentro del espacio de nombres y luego implementar el exterior de esta manera:
namespace test {
class MyClass;
}
class test::MyClass {
//...
};
Visual Studio 2017
Menú de sangría del espacio de nombres VS2017
Puede acceder a esta configuración de "Contenido del espacio de nombres de sangría" en Herramientas-> Opciones, luego Editor de texto-> C / C ++ -> Formatear-> Inden- tar. Está en el fondo de los menús, pero extremadamente útil una vez encontrado.