2010-02-17 15 views
15

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?

+1

¿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

+1

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

+1

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 ... –

Respuesta

8

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:

Rule Options

+0

No lo probé todavía, pero por la descripción se ve increíble, ¡gracias! – mafu

+0

@mafutrct: Su bienvenida :) Lo probé y funciona. Es muy agradable tener esa flexibilidad entre pestañas y espacios. –

1

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.

3

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

10

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> 
2

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 .....]

1

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:

DotNetAnalyzers/StyleCopAnalyzers

.NET Core, Code Analysis and StyleCop

Cuestiones relacionadas