0059 — EditorСonfig

Содержимое страницы

Давным давно среди программистов были популярны срачи на следующие темы:

  • Табы или пробелы.
  • Два, три или четыре пробела.
  • Пустая строка в конце файла — нужна или нет?
  • Конец файла — LF или CRLF?

Авторы проекта EditorConfig пришли к выводу, что на самом деле настройки форматирования кода следует задавать на уровне всего проекта, но без привязки к IDE или текстовому редактору. Если раньше в проект добавляли каталоги типа .vscode, то сейчас в этом нет необходимости.

Установка

Чтобы использовать EditorConfig:

  1. Создайте в корневом каталоге проекта файл .editorconfig, в котором задайте необходимые настройки на уровне всего проекта.

    Список возможных настроек вы можете посмотреть на сайте проекта. Ниже будет мой вольный перевод.

  2. (Опционально) Если нужно переопределить настройки корневого .editorconfig в подкаталогах, создайте в них свои .editorconfig.

  3. В свою IDE или редактор установите плагин / расширение / пакет, поддерживающие EditorConfig. Если у вас GNU Emacs, добавьте в init.el такой код:

    ;; 📦 EDITORCONFIG
    ;; Поддержка https://editorconfig.org/
    ;; https://github.com/editorconfig/editorconfig-emacs
    (use-package editorconfig
      :ensure t
      :delight ""
      :config
      (editorconfig-mode 1)
      :mode
      ("\\.editorconfig\\'" . editorconfig-conf-mode))
    

Настройка

Файл .editorconfig имеет формат INI, то есть состоит из секций, каждая из которых содержит список настроек.

Название секции — это выражение, определяющее шаблон имён файлов, к которым следует применять настройки. Типовые названия секций:

  • [*] — все типы файлов;
  • [*.js] — JavaScript;
  • [*.py] — Python;
  • [*.rst] — ReStructured Text;
  • [*.y{a}ml] — YAML (*.yml и *.yaml попадут в это выражение).
  • [Makefile] — Makefile.

Внутри секций размещаются параметры:

  • root — признак того, что это корневой .editorconfig.

  • true — поиск .editorconfig в родительских каталогах не выполняется.

  • false (по умолчанию) — будет выполнена попытка найти .editorconfig ещё и в родительских каталогах.

  • charset — кодировка.

  • end_of_line — тип концов строк:

  • lf — используется в *nix-системах;

  • crlf — используется в Windows.

  • indent_style — тип выравнивания:

  • space — пробелы;

  • tab — табы.

  • indent_size — если для выравнивания используются пробелы, то при нажатии [TAB] будет вставлено их указанное количество.

  • tab_width — размер таба при отображении в редакторе.

  • insert_final_newline — вставка пустой строки в конце файла. Помогает немного уменьшить diff при добавлении контента в конец файла.

  • trim_trailing_whitespace — удаление висячих пробелов. Висячими называются пробелы в конце строк. Как правило, они ни на что не влияют, но занимают место и могут увеличивать diff.

  • max_line_length — максимальная длина строки. Если длина будет больше указанной, строка будет разбита.

Примеры

Типовой .editorconfig выглядит так:

# Указываем, что это корневые настройки, искать в каталогах
# выше нет смысла.
root = true

# Настройки для всех типов файлов
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

# Настройки для отдельного типа файла
[*.rst]
indent_size = 3

Настройки в отдельных секциях наследуют настройки из секции [*], то есть приведённая выше запись эквивалентна такой:

# Указываем, что это корневые настройки, искать в каталогах
# выше нет смысла.
root = true

# Настройки для всех типов файлов
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

# Настройки для отдельного типа файла
[*.rst]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 3
insert_final_newline = true
trim_trailing_whitespace = true

AsciiDoc

root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[Makefile]
indent_style = tab

Как видите, в Makefile те же самые настройки, что и на уровне всего проекта, только вместо пробелов используются табы, которые являются частью синтаксиса.

Sphinx

root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[Makefile]
indent_style = tab

[*.py]
indent_size = 4

[*.rst]
indent_size = 3

Markdown

root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
indent_size = 4

CSS

root = true

[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

Заключение

Я считаю, что .editorconfig должен лежать в корне любого проекта. Это, во-первых, снижает уровень хаоса на проекте. Во-вторых, уменьшает diff. В-третьих, приводит форматирование кода к единому стилю. Осталось только настроить pre-commit, и вы в шоколаде.