Привет, Хабр! Культурные воины продолжаются, люди сражаются по разные стороны баррикад, пытаясь решить: tabs or spaces. На эту же тему мы нашли интересную статью Скотта Хансельмана, в которой он рассказывает про инструмент, решающий это спор, EditorConfig в Visual Studio. Всех интересующихся прошу под кат.




Помните, летом на StackOverflow была статья о том, что на пробелах люди зарабатывают больше.



Разберемся в этом вместе с Джиной Трапани (Gina Trapani). Найдем рабочий код.

Разработчики могут ломать копья и дальше, но проблема форматирования кода решается с помощью файла EditorConfig. Удивительно, но многие люди пользуются им, сами того не зная, так что эта публикация будет просто маленькой подсказкой. Расскажите об этом коллегам.

Откройте проект, создайте новый файл .editorconfig и вставьте в него следующий код. Я воспользуюсь программой «Hello, world!» в новой консоли .NET.

[*.cs]
indent_style = tab
indent_size = tab
tab_size = 4

В моем примере указано только расширение *.cs, но вы также можете указать [*.{cs,js}] или, если хотите, только [*], либо сразу множество разделов.

Убедитесь, что файл введен в систему вместе с проектом, чтобы каждый член команды смог оценить все его преимущества.

Вы можете увидеть в Notepad2, если кто-то, как в каменном веке, использует пробелы в качестве разделителя. Пробелы в этом редакторе отображаются как бледные точки.



Я открываю этот проект в Visual Studio 2017 со встроенной поддержкой EditorConfig. Обратите внимание на отображаемое внизу предупреждение Visual Studio о том, что в проекте имеются обозначения, не совпадающие с нашими.

Команды Visual Studio для форматирования документов в этом проекте будут использовать знаки табуляции, а не пробелы. Вот тот же документ, переформатированный в Visual Studio:



Теперь я могу спать спокойно: пробелы побеждены, трезвые умы восторжествовали (по крайней мере, в рамках этого проекта).

Расширения .NET для EditorConfig


Более того, если позволяет используемый редактор, можно добавить расширения EditorConfig для определенных файлов или языков. Это позволит обеспечить единообразие при работе ваших сотрудников над проектом. Если вы знакомы с FxCop и StyleCop, то это примерно то же самое.

Вы можете использовать массу удобных опций .NET EditorConfig. Благодаря им члены команды будут применять одинаковые языковые стандарты, соглашения об именовании и правила форматирования.

  • Языковые стандарты. Это правила, применяемые в языке C# или Visual Basic, например тип var/explicit, функции и свойства в теле выражений.
  • Правила форматирования. Это правила разметки и структурирования кода, используемые для удобочитаемости, например стиль Олмана, пробелы в контрольных блоках.
  • Соглашения об именовании. Это правила именования объектов, например методы async должны заканчиваться на «Async».

Вы также можете задать степень важности правил, используя опции типа suggestion, warning или даже error.

Для примера сделаем так, чтобы мои сотрудники использовали предопределенные типы для локальных объектов:

dotnet_style_predefined_type_for_locals_parameters_members = true:error

В Visual Studio в соответствующей строке появится значок лампочки с предлагаемым исправлением, ведь, скорее всего, мои сотрудники вместо полной формы «System.String» напечатают просто «string».



В EditorConfig для .NET Docs имеется МНОЖЕСТВО отличных настроек, которыми можно пользоваться или игнорировать их. Вот лишь несколько (неоднозначных) примеров:

  • csharp_new_line_before_open_brace — оставлять открытые скобки в конце строки или помещать их на отдельной строке?
  • csharp_new_line_before_members_in_object_initializers — допускается ли размещение элементов A = 3, B = 4 на одной строке или каждый из них располагается на отдельной строке?
  • csharp_indent_case_contents — будут ли все команды switch/case отображаться одинаково в начале строки или все же перед командами case будет стоять отступ, как и было задумано создателем?
  • Мы можем даже всячески настраивать регистр Case: pascal_case, camel_case, first_word_upper, all_upper, all_lower

Если вы работаете с Visual Studios 2010, 2012, 2013 или 2015, то можете быть спокойны. Как минимум, имеется базовое бесплатное расширение EditorConfig, с помощью которого можно применять основные правила. Есть также одно расширение для работы с файлами EditorConfig в Visual Studio Code, и установить его можно за считанные секунды. Но вот расширения для С# пока нет — есть только одно для преобразования пробелов.



Кстати, летом мы проводили голосование на эту тему в Microsoft Developer. Тогда победил Tabs. Предлагаем повторить здесь.

Комментарии (14)


  1. dmitry_dvm
    09.11.2017 13:47

    Юзаю дефолтные настройки студии и абсолютно без разницы пробелы там или табы. Главное, что отступ размером в 4 пробела. Тоже мне проблема.


    1. berez
      10.11.2017 21:09

      Разница чувствуется, когда табы и пробелы начинают идти вперемешку. Сразу хочется убивать.


  1. dude_sam
    09.11.2017 14:12

    Не нашёл настроек для кодировки по-умолчанию. И это, зачастую, более критично, нежели 4 пробела.
    Возможно, плохо искал. Хочу, чтобы у всех файлов всегда был UTF-8 without BOM.


    И, как понял, недоступно в VS Code и, столь необходимом в разработке, SSMS, уже тем более, новом грядушем, многоплатформенном редакторе (забыл название).


    1. dariy
      09.11.2017 14:40

      charset = utf-8
      Где оно доступно, а где нет — не в курсе.


  1. Jeditobe
    09.11.2017 14:21

    А в ReactOS стандарт — это пробелы…


    1. dipsy
      09.11.2017 15:00

      Миллионы мух не могут ошибаться


    1. sumanai
      09.11.2017 15:35

      Код WRK тоже на пробелах, так что можете быть спокойны.


  1. Costic
    09.11.2017 15:11

    Я всегда думал, что в начале строки идут отступы для форматирования, а лексемы разделяются пробелами и другими знаками.
    Конечно, для отступов удобнее Таб, причём его размер у меня менялся от 4, 3 и до 2. Во время отладки 2 удобно, много помещается на экране, когда дампы переменных/памяти занимают место.
    Не знаю как сейчас, у меня Visual Assist с давних времен.


  1. roboter
    09.11.2017 15:52

    Насяльника я хочу прибавку к зарплате!
    на каком основании?
    я использую пробелы.
    окей.


  1. kosmos89
    09.11.2017 16:38

    У вас с этим EditorConfig есть неприятная проблема: если открыть проект, где используется EditorConfig, то настройки от него начнут действовать и на другие проекты, где НЕ используется EditorConfig. Т.е. это заменяет ГЛОБАЛЬНЫЕ настройки студии.
    Конкретно в моем случае после открытия проекта, где в EditorConfig были указаны пробелы, в другом проекте стали везде ставиться пробелы, хотя у меня в настройках стояли табуляции. И каждый раз, после того, как я поработал с тем проектом, надо снова лезть в опции и выставлять табы.


    1. ForNeVeR
      10.11.2017 07:05

      Та же самая проблема будет, если вы не используете EditorConfig: работаешь с одним проектом — ставь глобально табы, работаешь с другим — ставь глобально пробелы.


      Похоже, единственной адекватной опцией при работе с Visual Studio (в которой нет концепции локальных настроек отступов) является использование EditorConfig везде, на всех проектах. При этом «засорять» сторониие репозитории этим файлом необязательно — можно просто помещать его уровнем выше относительно *.sln. В такой конфигурации он тоже должен работать (но, честно признаюсь, я проверял довольно давно).


      Ну и начиная с 2017 студии можно держать несколько её инсталляций, заточенных на разные проекты (наверное, и настройки отступов тоже будут разные). Но из-за такой мелочи держать отдельную инсталляцию Visual Studio — это, конечно, оверхед.


  1. kekekeks
    10.11.2017 11:26

    Про поддержку editorconfig сказали, а про расширение TabSanity, которое заставляет пробелы ВЫГЛЯДЕТЬ как табы для клавиатурной навигации по коду — нет. Что ж за люди такие.


  1. TotalPipets
    10.11.2017 21:10

    Спасибо за статью. Не знал об этом, попробую.


  1. vlivyur
    11.11.2017 12:41

    Я что-то не понял, а стандартные Ctrl+E, D уже отменили?
    Или Productivity Power Tools уже не актуален?
    Чужие исходники читаю только с их помощью. Работают не всегда идеально, но с такой фигнёй, как пробелы вперемешку с табами, справляются.