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, и вы в шоколаде.