StyleCop ofrece verificar el uso coherente de los espacios, pero lamentablemente carece de la idea opuesta: Forzar código fuente para usar pestañas. ¿Hay alguna forma de agregar esta funcionalidad? No tiene que ser StyleCop, también se aceptan otras herramientas.¿Hay alguna manera de aplicar pestañas en lugar de espacios?
Respuesta
usted puede utilizar StyleCop+ plugin para cumplir uso de pestañas.
Después de descargar StyleCopPlus.dll
colóquelo en la carpeta Custom Rules
dentro de la carpeta principal de StyleCop C:\Program Files (x86)\StyleCop 4.7\Custom Rules
o directamente en la carpeta principal.
Ahora, al abrir un Settings.StyleCop
con StyleCopSettingsEditor
, podrá establecer la regla SP2001: CheckAllowedIndentationCharacters
.
Esta regla se puede encontrar en la pestaña StyleCop+
, bajo la More Custom Rules
pestaña secundaria, bajo la Formatting
título:
No lo probé todavía, pero por la descripción se ve increíble, ¡gracias! – mafu
@mafutrct: Su bienvenida :) Lo probé y funciona. Es muy agradable tener esa flexibilidad entre pestañas y espacios. –
Hágalo dentro de su servidor de control de fuente. Utilice un script precompromiso para verificar el archivo de líneas que comiencen con espacios múltiples y evite la confirmación.
Acepto que las pestañas son mejores que los espacios. Es una preferencia personal, pero la coherencia del equipo es muy importante.
Una cosa que podrías hacer, asumiendo que estás usando Visual Studio como tu IDE, y que tus compañeros de equipo se adhieran a esta idea, sería establecer VS para usar pestañas en lugar de espacios, exportar y compartir la configuración archivo.
La configuración se puede encontrar en Herramientas> Opciones> Editor de texto> Todos los idiomas (o el idioma que desea usar)> Pestañas y luego en el lado derecho puede elegir 'Insertar espacios' o 'Mantener fichas' .
para exportar la configuración de su Visual Studio: Herramientas> Importar y exportar Configuración> configuración del entorno de exportación seleccionado> seleccionar el
Es sólo una idea 'Opciones' - pero para ser sincero, el verdadero problema parece ser la compra a partir de tus compañeros de equipo. Siempre pueden volver a su configuración de otra manera. Alternativamente, al momento del check-in, como sugirió Sam, puede hacer un nuevo formateado automático.
HTH
StyleCop apoya creación de reglas personalizadas, para que pueda añadir sus propias "pestañas de uso líder en lugar de espacios" regla. Si no tiene ganas de tratar de desarrollar uno propio, puede obtener una regla existente en http://stylecopcontrib.codeplex.com/ o http://github.com/AArnott/nerdbank.stylecop.rules.
Soy una persona de tabuladores no espacios, también, aunque hay muchas razones para usar cualquiera de ellos y hay otros lugares para entrar en por qué crees que uno es mejor que el otro. :)
En realidad, yo quería lo mismo, una regla para comprobar las sangrías de las pestañas, así que lo escribí sobre la base de la fuente SpacingRules de StyleCop. Parece funcionar razonablemente bien, aunque hasta ahora solo lo he usado en algunos proyectos. Probablemente podría ser optimizado o lo que sea ... pero funciona.
using System;
using System.Text.RegularExpressions;
using Microsoft.StyleCop;
using Microsoft.StyleCop.CSharp;
namespace CustomRules.StyleCop.CSharp
{
[SourceAnalyzer(typeof(CsParser))]
public class SpacingRules : SourceAnalyzer
{
public SpacingRules()
{
}
public override void AnalyzeDocument(CodeDocument document)
{
Param.RequireNotNull(document, "document");
CsDocument csdocument = (CsDocument)document;
if (csdocument.RootElement != null && !csdocument.RootElement.Generated)
{
this.CheckSpacing(csdocument.Tokens);
}
}
private void CheckSpacing(MasterList<CsToken> tokens)
{
Param.AssertNotNull(tokens, "tokens");
foreach (var token in tokens)
{
if (this.Cancel)
{
break;
}
if (token.Generated)
{
continue;
}
switch (token.CsTokenType)
{
case CsTokenType.WhiteSpace:
this.CheckWhitespace(token as Whitespace);
break;
case CsTokenType.XmlHeader:
XmlHeader header = (XmlHeader)token;
foreach (var xmlChild in header.ChildTokens)
{
this.CheckTabsInComment(xmlChild);
}
break;
case CsTokenType.SingleLineComment:
case CsTokenType.MultiLineComment:
this.CheckTabsInComment(token);
break;
}
switch (token.CsTokenClass)
{
case CsTokenClass.ConstructorConstraint:
this.CheckSpacing(((ConstructorConstraint)token).ChildTokens);
break;
case CsTokenClass.GenericType:
this.CheckGenericSpacing((GenericType)token);
this.CheckSpacing(((TypeToken)token).ChildTokens);
break;
case CsTokenClass.Type:
this.CheckSpacing(((TypeToken)token).ChildTokens);
break;
}
}
}
private void CheckGenericSpacing(GenericType generic)
{
Param.AssertNotNull(generic, "generic");
if (generic.ChildTokens.Count == 0)
{
return;
}
foreach (var token in generic.ChildTokens)
{
if (this.Cancel)
{
break;
}
if (token.CsTokenClass == CsTokenClass.GenericType)
{
this.CheckGenericSpacing(token as GenericType);
}
if (!token.Generated && token.CsTokenType == CsTokenType.WhiteSpace)
{
this.CheckWhitespace(token as Whitespace);
}
}
}
private void CheckWhitespace(Whitespace whitespace)
{
Param.AssertNotNull(whitespace, "whitespace");
if (whitespace.Location.StartPoint.IndexOnLine == 0 && Regex.IsMatch(whitespace.Text, "^ +"))
{
this.AddViolation(whitespace.FindParentElement(), whitespace.LineNumber, "TabsMustBeUsed");
}
}
private void CheckTabsInComment(CsToken comment)
{
Param.AssertNotNull(comment, "comment");
var lines = comment.Text.Split('\n');
for (int i = 0; i < lines.Length; i++)
{
if (Regex.IsMatch(lines[i], "^ +"))
{
this.AddViolation(comment.FindParentElement(), comment.LineNumber + i, "TabsMustBeUsed");
}
}
}
}
}
Tenga en cuenta que también hay que tener el archivo XML incrustado "SpacingRules.xml" en el montaje al lado de esta cosa. (Lea el documento StyleCop SDK para más sobre esto.)
<?xml version="1.0" encoding="utf-8" ?>
<SourceAnalyzer Name="Custom Spacing Rules">
<Description>
Rules which verify the spacing placed between keywords and symbols in the code.
</Description>
<Rules>
<Rule Name="TabsMustBeUsed" CheckId="MY1027">
<Context>Spaces are not allowed. Use tabs instead.</Context>
<Description>Verifies that the code does not contain spaces.</Description>
</Rule>
</Rules>
</SourceAnalyzer>
Ok he conseguido averiguar el problema debido a que la razón por la cual aparece esta advertencia, que aparece debido a que el desarrollador veces copia y pega el código
si está utilizando VS2010 Ir al explorador de soluciones Fecha de programación del estilo de Cop a continuación, modificar la configuración interior de la Cop estilo por ejemplo, desactivar o desactive el ajuste [espaciado .....]
El enfoque del paquete:
Parece que la tendencia actual es hacer esto a través de paquetes nuget (y que el clásico StyleCop puede ser eliminado en algún momento). Por lo tanto, para hacer esto con los paquetes, haga lo siguiente:
través Nuget:
Install-Package Microsoft.CodeAnalysis.FxCopAnalyzers
Install-Package StyleCop.Analyzers -Version 1.1.0-beta006
Aviso la referencia a la pre-releaset (en este momento), la configuración de las pestañas sólo están disponibles en el beta.
añadir el siguiente código a su proyecto como ca.ruleset:
<?xml version="1.0" encoding="utf-8"?>
<RuleSet Name="Custom Rulset" Description="Custom Rulset" ToolsVersion="14.0">
<Rules AnalyzerId="AsyncUsageAnalyzers" RuleNamespace="AsyncUsageAnalyzers">
<Rule Id="UseConfigureAwait" Action="Warning" />
</Rules>
<Rules AnalyzerId="Microsoft.Analyzers.ManagedCodeAnalysis" RuleNamespace="Microsoft.Rules.Managed">
<Rule Id="CA1001" Action="Warning" />
<Rule Id="CA1009" Action="Warning" />
<Rule Id="CA1016" Action="Warning" />
<Rule Id="CA1033" Action="Warning" />
<Rule Id="CA1049" Action="Warning" />
<Rule Id="CA1060" Action="Warning" />
<Rule Id="CA1061" Action="Warning" />
<Rule Id="CA1063" Action="Warning" />
<Rule Id="CA1065" Action="Warning" />
<Rule Id="CA1301" Action="Warning" />
<Rule Id="CA1400" Action="Warning" />
<Rule Id="CA1401" Action="Warning" />
<Rule Id="CA1403" Action="Warning" />
<Rule Id="CA1404" Action="Warning" />
<Rule Id="CA1405" Action="Warning" />
<Rule Id="CA1410" Action="Warning" />
<Rule Id="CA1415" Action="Warning" />
<Rule Id="CA1821" Action="Warning" />
<Rule Id="CA1900" Action="Warning" />
<Rule Id="CA1901" Action="Warning" />
<Rule Id="CA2002" Action="Warning" />
<Rule Id="CA2100" Action="Warning" />
<Rule Id="CA2101" Action="Warning" />
<Rule Id="CA2108" Action="Warning" />
<Rule Id="CA2111" Action="Warning" />
<Rule Id="CA2112" Action="Warning" />
<Rule Id="CA2114" Action="Warning" />
<Rule Id="CA2116" Action="Warning" />
<Rule Id="CA2117" Action="Warning" />
<Rule Id="CA2122" Action="Warning" />
<Rule Id="CA2123" Action="Warning" />
<Rule Id="CA2124" Action="Warning" />
<Rule Id="CA2126" Action="Warning" />
<Rule Id="CA2131" Action="Warning" />
<Rule Id="CA2132" Action="Warning" />
<Rule Id="CA2133" Action="Warning" />
<Rule Id="CA2134" Action="Warning" />
<Rule Id="CA2137" Action="Warning" />
<Rule Id="CA2138" Action="Warning" />
<Rule Id="CA2140" Action="Warning" />
<Rule Id="CA2141" Action="Warning" />
<Rule Id="CA2146" Action="Warning" />
<Rule Id="CA2147" Action="Warning" />
<Rule Id="CA2149" Action="Warning" />
<Rule Id="CA2200" Action="Warning" />
<Rule Id="CA2202" Action="Warning" />
<Rule Id="CA2207" Action="Warning" />
<Rule Id="CA2212" Action="Warning" />
<Rule Id="CA2213" Action="Warning" />
<Rule Id="CA2214" Action="Warning" />
<Rule Id="CA2216" Action="Warning" />
<Rule Id="CA2220" Action="Warning" />
<Rule Id="CA2229" Action="Warning" />
<Rule Id="CA2231" Action="Warning" />
<Rule Id="CA2232" Action="Warning" />
<Rule Id="CA2235" Action="Warning" />
<Rule Id="CA2236" Action="Warning" />
<Rule Id="CA2237" Action="Warning" />
<Rule Id="CA2238" Action="Warning" />
<Rule Id="CA2240" Action="Warning" />
<Rule Id="CA2241" Action="Warning" />
<Rule Id="CA2242" Action="Warning" />
<Rule Id="CA1012" Action="Warning" />
</Rules>
<Rules AnalyzerId="StyleCop.Analyzers" RuleNamespace="StyleCop.Analyzers">
<Rule Id="SA1305" Action="Warning" />
<Rule Id="SA1412" Action="Warning" />
<Rule Id="SA1600" Action="None" />
<Rule Id="SA1609" Action="Warning" />
</Rules>
</RuleSet>
agregarlo a su archivo de proyecto mediante la edición del archivo .csproj y añadiendo:
<PropertyGroup>
<CodeAnalysisRuleSet>ca.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
Para sustituir la pestaña (y otras configuraciones, deberá agregar un archivo stylecop.json a su proyecto. En las propiedades del archivo, establezca Build Action en '(analizador) archivo adicional'. Dependiendo del tipo de proyecto, la palabra real "analizador" puede no estar presente.
Editar el archivo stylecop.json a algo como lo siguiente:
{
"$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
"settings": {
"documentationRules": {
"companyName": "YourCompanyName",
"copyrightText": "Copyright (c) {companyName}. All Rights Reserved.\r\nLicensed under the Apache License, Version 2.0. See LICENSE in the project root for license information.",
"xmlHeader": false,
"fileNamingConvention": "metadata"
},
"indentation": {
"useTabs": true
}
}
}
Al menos para los proyectos estándar .NET, es necesario asegurar que el siguiente está en el archivo csproj (y no hay otras referencias para presentar):
<ItemGroup>
<AdditionalFiles Include="stylecop.json" />
</ItemGroup>
Puede que tenga que volver a cargar el proyecto y los paquetes para llegar a reconocer el archivo stylecop.json.
Referencias:
- 1. Insertar espacios en lugar de pestañas en TODOS los archivos
- 2. ¿Hay alguna manera de aplicar una columna única usando doctrine2?
- 3. ¿Hay alguna manera de hacer que Visual Studio deje de sangrar espacios de nombres?
- 4. ¿Hay alguna manera de hacer que Eclipse trate 4 espacios exactamente como trata una pestaña?
- 5. Eliminando pestañas al usar pestañas como espacios
- 6. ¿Hay alguna manera de negar un predicado?
- 7. ¿Hay alguna manera de ocultar la barra de pestañas de JTabbedPane si solo existe una pestaña?
- 8. Emacs: pestaña Insertar en lugar de espacios
- 9. ¿Hay alguna manera de establecer el orden de las pestañas en ASP.net?
- 10. ¿Hay alguna manera de colorear las pestañas de un tabpage en winforms?
- 11. Cómo forzar espacios en lugar de pestañas independientemente del modo principal?
- 12. ¿Hay alguna manera de aplicar una función a cada miembro de una estructura en C++?
- 13. ¿Hay alguna manera de aplicar la función en línea en C#?
- 14. espacios como pestañas y el comportamiento de retroceso en Vim
- 15. ¿Hay alguna manera de aplicar opacidad a los elementos secundarios absolutamente posicionados en ie8
- 16. ¿Hay alguna manera de aplicar estilos CSS múltiples en un lote para evitar múltiples reflujos?
- 17. ¿Hay alguna manera de hacer referencia (en XAML) a un conjunto con espacios en su nombre?
- 18. ¿Hay alguna manera de utilizar DPI en consultas de medios css en lugar de px
- 19. En Visual Studio, ¿hay alguna manera de agrupar solo comentarios?
- 20. Java: ¿Hay alguna manera de aplicar una implementación de métodos privados?
- 21. ¿Hay alguna manera de ignorar los espacios de nombres durante una transformación XSL?
- 22. ¿Hay alguna manera de pausar una CABasicAnimation?
- 23. ¿Hay alguna manera de configurar vimdiff para ignorar TODOS los espacios en blanco?
- 24. ¿Hay alguna manera de anular ConfigurationManager.AppSettings?
- 25. ¿Hay alguna manera de desactivar una etiqueta?
- 26. ¿Hay alguna manera de omitir el parámetro?
- 27. ¿Hay alguna manera de decirle a Doxygen que ignore (todos) los espacios de nombres?
- 28. ¿Hay alguna manera de dibujar un CGContextDrawRadialGradient como un óvalo en lugar de un círculo perfecto?
- 29. ¿Hay alguna manera de que los argumentos sean var en lugar de val?
- 30. ¿Hay alguna manera de diferenciar archivos oración por frase en lugar de línea por línea?
¿Por qué quiere forzar pestañas en lugar de espacios? Me doy cuenta de que tiene una necesidad para esto y no tengo una respuesta a su pregunta, pero tengo curiosidad sobre las circunstancias que precipitaron su requerimiento. – Lazarus
Es un paso para forzar lentamente a alguien a escribir código con una sangría sana. Al ver su código actual, me da vueltas la cabeza. – mafu
Los espacios son más fáciles de cortar y pegar que las pestañas. No conozco una herramienta para esto, pero trataría de forzar una buena sangría espacial en lugar de forzar una buena sangría de tabulación. Debido a que la sangría también puede ser desordenada con las pestañas ... –