В любой команде разработчиков рано или поздно возникает проблема несогласованного форматирования кода: кто-то использует табы, кто-то пробелы, у одного LF, у другого CRLF, у кого-то в конце строки мусорные пробелы, у кого-то - нет. В результате - бесконечные конфликты в Git и споры "как правильно".

EditorConfig решает эту проблему просто и элегантно.


EditorConfig - это стандарт и набор инструментов, позволяющих задавать правила форматирования кода на уровне проекта, а не отдельного редактора.

Он работает через файл .editorconfig, который:

  • хранится в репозитории,
  • применяется автоматически,
  • поддерживается большинством IDE и редакторов (VS Code, PhpStorm, WebStorm, IntelliJ, Sublime Text, Vim, Emacs и др.).

Пример базового .editorconfig:

root = true

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

root = true

Это одна из самых важных строк в EditorConfig, она говорит редактору: "Этот .editorconfig - корневой. Не ищи другие .editorconfig выше по дереву каталогов".

Без root = true редактор может:

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

Это может привести к неожиданному поведению.


Как работают секции EditorConfig

[*.php]
indent_size = 4
  • [*] - применяется ко всем файлам
  • [*.php] - только к PHP
  • [*.{js,ts}] - сразу к нескольким типам
  • [Makefile] - к конкретному файлу

Поддерживаемые свойства

  • charset
  • end_of_line
  • indent_style
  • indent_size
  • tab_width
  • insert_final_newline
  • trim_trailing_whitespace
  • max_line_length

charset

Задаёт кодировку файлов. Возможные значения:

  • utf-8
  • utf-8-bom
  • latin1
  • utf-16be
  • utf-16le

Всегда используй utf-8 - это стандарт де-факто.


end_of_line

Определяет символ конца строки. Возможные значения:

  • lf - Unix / Linux / macOS (\n)
  • crlf - Windows (\r\n)
  • cr - старый Mac (почти не используется)

Разные окончания строк - частая причина git-конфликтов.

lf - лучший универсальный вариант.


indent_style

Определяет чем делать отступы. Возможные значения:

  • space - пробелы
  • tab - табуляция

Многие проекты предпочитают пробелы из-за предсказуемости.


indent_size

Количество пробелов для одного уровня отступа. Возможные значения:

  • Число (2, 4, 8)
  • tab - использовать размер табуляции

Используется только если indent_style = space.


tab_width

Определяет визуальную ширину символа табуляции, используется только если indent_style = tab.


insert_final_newline

Добавляет пустую строку в конце файла.

Почему это важно:

  • Требование POSIX
  • Корректная работа Unix-утилит
  • Git перестаёт ругаться

Всегда true.


trim_trailing_whitespace

Удаляет пробелы и табы в конце строк.


max_line_length

Задаёт максимальную длину строки. Возможные значения:

  • Число (80, 100, 120)
  • off - отключить ограничение

EditorConfig не переносит строки, а лишь:

  • показывает guideline,
  • предупреждает в редакторе.

Практический пример для разных файлов

root = true

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

[*.php]
indent_style = space
indent_size = 4
max_line_length = 120

[*.{js,ts}]
indent_style = space
indent_size = 2
max_line_length = 100

[Makefile]
indent_style = tab

Source: Orkhan Alishov's notes