Генератор EditorConfig

.editorconfig

Отметьте экосистемы, которые есть в вашем репозитории. Каждая добавит секцию с правилами, нужными именно ей.

Далее

Файл .editorconfig в корне репозитория сообщает всем современным IDE, как этот проект форматирует свои файлы, и закрывает спор «табы или пробелы» для каждого файла отдельно. Сложность не в глобальном блоке, а в секциях для отдельных языков: YAML вообще нельзя отбивать табуляцией, make не принимает строку рецепта, начинающуюся с пробела, а скрипт оболочки, сохранённый с CRLF, не запускается. Отметьте языки, которые есть в вашем репозитории, и генератор напишет нужную каждому секцию, а рядом пояснит, зачем она там.

Как собрать файл .editorconfig

  1. 1

    Отметьте языки, которые есть в репозитории

    JavaScript, JSON, HTML и CSS, YAML, Python, PHP, Go, Rust, Ruby, Java, Markdown, Makefile, скрипты оболочки и пакетные файлы Windows. Каждая отметка добавляет одну секцию.

  2. 2

    Задайте правила, которые наследуют все файлы

    Стиль и размер отступа, конец строки, кодировка, перенос строки в конце файла, пробелы в конце строк и ограничение длины строки. Всё это попадает в блок `[*]` наверху, а каждая секция ниже переопределяет только то, что действительно нужно её языку.

  3. 3

    Прочитайте, зачем нужна каждая секция

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

  4. 4

    Скопируйте файл в корень репозитория

    Сохраните его как `.editorconfig` рядом с `.gitignore`. Редакторы подхватят его на следующем открытом файле: без шага сборки и без настройки плагинов.

Что делает файл .editorconfig

Файл с именем .editorconfig в корне проекта объявляет соглашения о форматировании. Редакторы с поддержкой EditorConfig (все основные IDE и большинство современных текстовых редакторов) применяют эти правила при открытии файла. Поиск идёт вверх по дереву каталогов от редактируемого файла и останавливается на первом файле, где указано root = true.

Пример вывода

При настройках по умолчанию (пробелы, размер отступа 4, LF, utf-8) и двух секциях, которые отмечены за вас, генератор выдаёт:

root = true

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

[*.{md,markdown}]
trim_trailing_whitespace = false

[{Makefile,makefile,GNUmakefile,*.mk}]
indent_style = tab

Отметьте Python, Go или YAML, и ниже появится соответствующая секция, уже с тем соглашением, которого придерживается форматтер этой экосистемы.

Основные директивы

Директива Допустимые значения Примечания
root true Указывается в корне проекта, чтобы поиск остановился здесь
charset latin1, utf-8, utf-8-bom, utf-16be, utf-16le Обычно выбирают utf-8. Маркер порядка байтов спецификация не рекомендует, а пара utf-16 распространяется на все файлы, и читать их большинство сборочных инструментов не умеет
end_of_line lf, crlf, cr lf для кроссплатформенной работы; crlf только для репозиториев под одну Windows
indent_style space, tab
indent_size целое число или tab При indent_style = tab оно не игнорируется: на него опирается tab_width, то есть оно задаёт визуальную ширину табуляции
tab_width целое число Нужен редко, так как по умолчанию равен indent_size
insert_final_newline true, false Держит файлы в согласии с POSIX, а диффы чистыми
trim_trailing_whitespace true, false Отключите для Markdown, где пробелы в конце строки означают перенос
max_line_length положительное целое число или unset В основной спецификации его нет, оно описано в вики со свойствами. Чтобы ограничения не было, уберите строку, а не пишите 0

Три правила, которые ломают сборку, а не просто стайлгайд

Большинство записей в .editorconfig отражают предпочтения команды. Следующие три к предпочтениям не относятся, и именно ради них стоит заводить отдельные секции по языкам:

  • YAML запрещает символ табуляции в отступах. Это ошибка разбора, а не замечание линтера. Если проект отбивается табами, а в нём есть workflow для GitHub Actions, файлы Docker Compose или манифесты Kubernetes, секция YAML обязана вернуть пробелы.
  • make требует настоящий символ табуляции в начале каждой строки рецепта. Пробел даёт missing separator. Stop., и сборка прекращается. Поэтому в [{Makefile,makefile,GNUmakefile,*.mk}] перечислено несколько написаний: EditorConfig сопоставляет имена файлов с учётом регистра, а в репозиториях встречаются и Makefile, и makefile.
  • Скрипт оболочки, сохранённый с CRLF, не запускается. Ядро считает возврат каретки частью пути к интерпретатору и сообщает что-то вроде /bin/bash^M: bad interpreter: No such file or directory. У пакетных файлов Windows зеркальная проблема: cmd.exe ищет goto и call :label по смещению в байтах, поэтому .bat только с LF может перейти не на ту строку или остановиться на полпути вообще без ошибки.

Две из этих проблем глобальный блок не решает, а как раз создаёт, поэтому генератор за ними следит. Если выбрать табы и не добавить секцию YAML или выбрать CRLF и не добавить секцию для скриптов оболочки, готовый файл сломает эти файлы, хотя ни разу их не упомянет. Генератор скажет об этом прямо над выводом, а не оставит вас выяснять это по упавшему пайплайну. То же касается кодировок utf-16: они распространяются на все файлы проекта, а make, интерпретаторы оболочки и Python не читают сохранённые так исходники.

Соглашения языков, которые пишет этот генератор

Язык или файл Секция Что задаёт и почему
JavaScript, TypeScript *.{js,jsx,mjs,cjs,ts,tsx} 2 пробела, значение Prettier по умолчанию
JSON *.{json,jsonc} 2 пробела, столько npm пишет в package.json
HTML, CSS, шаблоны *.{html,htm,css,scss,sass,less,vue,svelte} 2 пробела, и отступному синтаксису Sass они нужны, чтобы файл разобрался
YAML *.{yml,yaml} 2 пробела, причём пробелы даже тогда, когда в проекте табы
Python *.{py,pyi} 4 пробела, PEP 8 и Black
PHP *.php 4 пробела, PSR-12. В WordPress приняты табы, в Drupal 2 пробела
Go {*.go,go.mod} Табуляция, потому что gofmt делает отступы табами
Rust *.rs 4 пробела, значение rustfmt по умолчанию
Ruby {*.rb,*.rake,Gemfile,Rakefile} 2 пробела, значение RuboCop по умолчанию
Java *.java 4 пробела, соглашения Oracle. В стиле Google для Java их 2
Markdown *.{md,markdown} Сохраняет пробелы в конце строк: именно так в Markdown задаётся перенос
Makefile {Makefile,makefile,GNUmakefile,*.mk} Табуляция, которую требует make
Скрипты оболочки *.{sh,bash,zsh} LF, что бы ни стояло в остальном проекте
Пакетные файлы Windows *.{bat,cmd} CRLF, потому что cmd.exe ищет метки по смещению в байтах

Обратите внимание, чего в этой таблице нет: длины строки. В PEP 8 это 79 символов, в Black 88, в PSR-12 мягкие 120, в rustfmt 100. Любое из этих чисел, записанное в секцию языка, незаметно переопределило бы ограничение, которое вы выбрали для всего проекта, поэтому генератор оставляет max_line_length только в блоке [*], а сами числа держит здесь, где вы можете применить их осознанно.

Поддерживает ли это ваш редактор?

Встроенная поддержка: VS Code, семейство IntelliJ от JetBrains, Visual Studio, Sublime Text, Xcode и Notepad++. Vim, Emacs, Neovim и ещё нескольким редакторам нужен небольшой плагин. Файл представляет собой обычный INI, поэтому его читают и линтеры, и форматтеры: именно так с ним согласуются Prettier и некоторые языковые серверы.

Часто задаваемые вопросы

В корне проекта, с root = true в начале. Чтобы переопределить отдельные пути, можно добавить дополнительные файлы .editorconfig во вложенных каталогах: поиск поднимается вверх по дереву от редактируемого файла и останавливается на первом найденном root = true.

Поставьте в поле 0, и генератор не станет писать max_line_length в файл. У этого свойства документированы только положительные числа и общее для всей спецификации значение unset, которое нужно, чтобы отменить величину, унаследованную от родительского файла. Здесь файл верхнего уровня, отменять нечего, и отсутствующая строка говорит ровно то же самое. Чего писать не стоит, так это max_line_length = 0, как делал этот инструмент раньше: спецификация предписывает плагинам игнорировать неподдерживаемые значения, поэтому ноль означает не нулевой лимит, а строку, которая молча ничего не делает.

Нет. EditorConfig отвечает за пробелы и концы строк во всех редакторах, включая те, которыми пользуются коллеги, а вы нет. Prettier и языковые линтеры берут на себя более глубокие правила стиля: кавычки, точки с запятой, замыкающие запятые. Они дополняют друг друга, и базовые вещи Prettier возьмёт из вашего .editorconfig.

Потому что YAML вообще не допускает символ табуляции в отступах. Файл workflow или compose с отступами табами не проходит разбор ещё до того, как его увидит хоть один инструмент. Во всём остальном генератор сохраняет ваши табы и переопределяет только секцию YAML, о чём и предупреждает над файлом.

Поставьте end_of_line = crlf, если инструменты для Windows в этом репозитории действительно этого требуют. Обычно лучше указать здесь lf и добавить .gitattributes со строкой * text=auto: тогда git нормализует концы строк при коммите, а при checkout они будут соответствовать операционной системе.

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

Сопутствующие инструменты

Смешивание цветов

Смешайте два HEX-цвета в 2-20 равномерных образцов. Каждый промежуточный цвет показывается как HEX-код в верхнем регистре, включая оба края.

Счетчик FPS

Измерьте FPS браузера через requestAnimationFrame: сглаживание, минимальная и максимальная частота кадров, порог предупреждения и график по желанию. Работает локально, без загрузок и API.

Генератор случайных букв

Генерируйте случайные буквы A-Z. Выберите количество, верхний или нижний регистр либо смешанный вариант для игр, заданий и уроков.

Генератор бейджей README

Создавайте бейджи shields.io для файлов README на GitHub: статус сборки, версия, лицензия, число загрузок и покрытие кода. Просмотрите и скопируйте фрагмент Markdown.

Генератор случайных адресов

Создавайте 1–20 похожих на адрес записей для макетов и тестов в трёх упрощённых форматах.

Конвертер из формата HEX в ASCII

Преобразует последовательности шестнадцатеричных байтов в текст в формате ASCII. Отлично подходит для отладки протоколов, обратного инженеринга и решений задач типа CTF.

Инструмент доступен на других языках