StyleCop предлагает проверить постоянное использование пространств, но, к сожалению, отсутствует противоположная идея: введите исходный код Force для использования вкладок. Есть ли способ добавить эту функциональность? Это не должно быть StyleCop, другие инструменты также приветствуются.Есть ли способ принудительно использовать вкладки вместо пробелов?
ответ
вы можете использовать StyleCop+ плагин для обеспечения использование вкладок.
После загрузки StyleCopPlus.dll
поместите его в папку Custom Rules
внутри основной папки StyleCop C:\Program Files (x86)\StyleCop 4.7\Custom Rules
или непосредственно в основной папке.
Теперь, открыв Settings.StyleCop
с помощью StyleCopSettingsEditor
, вы сможете установить правило SP2001: CheckAllowedIndentationCharacters
.
Это правило можно найти на вкладке StyleCop+
под More Custom Rules
вложенную под Formatting
заголовком:
Я еще не пробовал, но из описания это выглядит потрясающе, спасибо! – mafu
@mafutrct: Ваше приветствие :) Я протестировал его, и он работает. Приятно иметь такую гибкость между вкладками и пробелами. –
Сделайте это на своем сервере управления версиями. Используйте сценарий предварительной фиксации, чтобы проверить файл на строки, начинающиеся с нескольких пробелов, и предотвратить фиксацию.
Я согласен, что вкладки лучше, чем пробелы. Это личное предпочтение, но последовательность команд очень важна.
Одна вещь, которую вы могли бы сделать, предполагая, что вы используете Visual Studio в качестве вашей IDE, и что ваш приёмник по команде для этой идеи заключается в том, чтобы установить VS вместо вкладок, экспортировать и поделиться настройками файл.
Этот параметр можно найти в разделе «Инструменты»> «Параметры»> «Текстовый редактор»> «Все языки» (или язык, который вы хотите использовать)> «Вкладки», а затем с правой стороны вы можете выбрать «Вставить пробелы» или «Сохранить вкладки», ,
Чтобы экспортировать настройки из визуальной студии: Инструменты> Импорт и экспорт Настройки> Параметры среды Экспорт выбранных> выберите «Параметры»
Просто мысли - но, честно говоря, реальная проблема, кажется, купить - от ваших товарищей по команде. В противном случае они могут вернуться к своим настройкам. Кроме того, при регистрации, как предложил Сэм, вы можете сделать автоматическое повторное форматирование.
НТН
StyleCop поддерживает создание пользовательских правил, так что вы можете добавить свои собственные «Использовать ведущие вкладки вместо пробелов» правила. Если вам не хочется разрабатывать свои собственные, вы можете получить существующее правило либо в http://stylecopcontrib.codeplex.com/, либо в http://github.com/AArnott/nerdbank.stylecop.rules.
Я тоже человек, не имеющий пробелов, хотя есть много причин использовать один из них, и есть другие места, чтобы попасть в , почему вы считаете, что один лучше другого. :)
На самом деле я хотел одно и то же - правило для проверки вкладок вкладок - поэтому я написал его на основе источника SpacingRules из StyleCop. Кажется, он работает достаточно хорошо, хотя я использовал его только в нескольких проектах. Вероятно, это может быть оптимизировано или что-то еще ... но оно работает.
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");
}
}
}
}
}
Обратите внимание, что вы также должны иметь встроенный XML-файл «SpacingRules.xml» в сборке вместе с этой вещью. (Прочитайте документ StyleCop SDK более подробно об этом.)
<?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>
Хорошо мне удалось выяснить проблему, потому что причина, почему появляется это предупреждение, оно появляется, потому что разработчик иногда скопировать и вставить код
если вы используете VS2010 Перейти к раствору исследователя Check в Настройка стиля Cop измените настройки внутри стиля Cop например отключить или снимите установку [Spacing .....]
Пакет подход:
Похоже, что нынешняя тенденция делать это через пакеты nuget (и что классический StyleCop может быть постепенно отключен). Таким образом, чтобы сделать это с помощью пакетов, выполните следующие действия:
через NuGet:
Install-Package Microsoft.CodeAnalysis.FxCopAnalyzers
Install-Package StyleCop.Analyzers -Version 1.1.0-beta006
Уведомление ссылка на предварительный releaset (в это время), настройки вкладки доступны только в бета.
добавьте следующий код в свой проект, как 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>
Добавьте его в свой файл проекта путем редактирования файла .csproj и добавления:
<PropertyGroup>
<CodeAnalysisRuleSet>ca.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
Чтобы изменить вкладку (и другие), вам нужно добавить файл stylecop.json в свой проект. В свойствах файла установите для параметра «Создать действие» («анализатор») дополнительный файл ». В зависимости от типа проекта фактическое слово «анализатор» может отсутствовать.
Отредактируйте stylecop.json файл что-то вроде следующего:
{
"$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
}
}
}
По крайней мере, для стандартных .NET проектов, вам необходимо убедиться, что следующая в файле csproj (и никакие другие ссылки на файл):
<ItemGroup>
<AdditionalFiles Include="stylecop.json" />
</ItemGroup>
Вы, возможно, придется перезагрузить проект и пакеты, чтобы заставить их распознать файл stylecop.json.
Ссылки:
Почему вы хотите, чтобы заставить вкладки, а не пробелы? Я понимаю, что у вас есть потребность в этом, и у меня нет ответа на ваш вопрос, но мне любопытно, в каких обстоятельствах это ускорило ваше требование. – Lazarus
Это один шаг, чтобы заставить кого-то писать код с разумным отступом. Глядя на их текущий код, моя голова вращается. – mafu
Пробелы более разрезаются и вставляются дружественными, чем вкладки. Я не знаю, какой инструмент для этого, но я бы попытался вытеснить хороший отступ в пространстве, а не форсировать хороший отступ вкладок. Потому что отступы могут быть грязными с вкладками тоже ... –