0059 — EditorСonfig
Давным давно среди программистов были популярны срачи на следующие темы:
- Табы или пробелы.
- Два, три или четыре пробела.
- Пустая строка в конце файла — нужна или нет?
- Конец файла — LF или CRLF?
Авторы проекта EditorConfig пришли к выводу, что на самом деле настройки форматирования кода следует задавать на уровне всего проекта, но без привязки к IDE или текстовому редактору. Если раньше в проект добавляли каталоги типа .vscode, то сейчас в этом нет необходимости.
Установка
Чтобы использовать EditorConfig:
-
Создайте в корневом каталоге проекта файл
.editorconfig, в котором задайте необходимые настройки на уровне всего проекта.Список возможных настроек вы можете посмотреть на сайте проекта. Ниже будет мой вольный перевод.
-
(Опционально) Если нужно переопределить настройки корневого
.editorconfigв подкаталогах, создайте в них свои.editorconfig. -
В свою 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, и вы в шоколаде.