Генератор EditorConfig
Файл .editorconfig в корне репозитория сообщает всем современным IDE, как этот проект форматирует свои файлы, и закрывает спор «табы или пробелы» для каждого файла отдельно. Сложность не в глобальном блоке, а в секциях для отдельных языков: YAML вообще нельзя отбивать табуляцией, make не принимает строку рецепта, начинающуюся с пробела, а скрипт оболочки, сохранённый с CRLF, не запускается. Отметьте языки, которые есть в вашем репозитории, и генератор напишет нужную каждому секцию, а рядом пояснит, зачем она там.
Как собрать файл .editorconfig
-
1
Отметьте языки, которые есть в репозитории
JavaScript, JSON, HTML и CSS, YAML, Python, PHP, Go, Rust, Ruby, Java, Markdown, Makefile, скрипты оболочки и пакетные файлы Windows. Каждая отметка добавляет одну секцию.
-
2
Задайте правила, которые наследуют все файлы
Стиль и размер отступа, конец строки, кодировка, перенос строки в конце файла, пробелы в конце строк и ограничение длины строки. Всё это попадает в блок `[*]` наверху, а каждая секция ниже переопределяет только то, что действительно нужно её языку.
-
3
Прочитайте, зачем нужна каждая секция
Таблица рядом с файлом поясняет каждую записанную секцию, поэтому лишние для вашей команды можно убрать ещё до коммита.
-
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.
Инструмент доступен на других языках
- Generador de EditorConfig [ES]
- Trình tạo EditorConfig [VI]
- EditorConfig 생성기 [KO]
- Generator EditorConfig [ID]
- Generator EditorConfig [PL]
- Générateur EditorConfig [FR]
- Gerador de EditorConfig [PT]
- EditorConfig-Generator [DE]
- مولد EditorConfig [AR]
- EditorConfig ジェネレーター [JA]
- EditorConfig-generator [NL]
- EditorConfig-generator [SV]
- เครื่องมือสร้าง EditorConfig [TH]
- EditorConfig Generator [EN]
- Generatore EditorConfig [IT]
- EditorConfig Oluşturucu [TR]
- EditorConfig 生成器 [ZH]