EditorConfig-generator

.editorconfig

Kies de ecosystemen in je repository. Elk ecosysteem voegt een sectie toe met de regels die het nodig heeft.

Volgende

Een .editorconfig in de hoofdmap van de repository vertelt elke moderne IDE hoe dit project zijn bestanden opmaakt, en beslecht de discussie tabs versus spaties per bestand. Het lastige zit niet in het globale blok, maar in de secties per taal: YAML laat zich helemaal niet met tabs inspringen, make weigert een receptregel die met een spatie begint, en een shellscript dat met CRLF is opgeslagen draait niet. Kies de talen in je repository, dan schrijft deze generator voor elke taal de sectie die nodig is, met daarnaast een notitie waarom die sectie er staat.

Zo bouw je een .editorconfig

  1. 1

    Kies de talen in je repository

    JavaScript, JSON, HTML en CSS, YAML, Python, PHP, Go, Rust, Ruby, Java, Markdown, Makefile, shellscripts en Windows-batchbestanden. Elke taal die je aanvinkt, voegt één sectie toe.

  2. 2

    Stel de regels in die elk bestand overneemt

    Inspringstijl en -grootte, regeleinde, tekenset, afsluitende nieuwe regel, spaties aan het regeleinde en de maximale regellengte. Die komen in het `[*]`-blok bovenaan, en elke sectie daaronder overschrijft alleen wat zijn eigen taal echt nodig heeft.

  3. 3

    Lees waarom elke sectie er staat

    De tabel naast het bestand legt elke geschreven sectie uit, zodat je de secties die je team niet wil, eruit kunt halen voordat je het bestand commit.

  4. 4

    Zet het in de hoofdmap van de repository

    Sla het op als `.editorconfig`, naast je `.gitignore`. Editors pakken het op bij het volgende bestand dat je opent: geen buildstap, geen plug-in om in te stellen.

Wat .editorconfig doet

Een bestand met de naam .editorconfig in de hoofdmap van een project legt opmaakconventies vast. Editors met EditorConfig-ondersteuning (elke grote IDE en de meeste moderne teksteditors) passen die regels toe zodra je een bestand opent. Het zoeken loopt vanaf het bestand dat je bewerkt omhoog door de mappenstructuur en stopt bij het eerste bestand waarin root = true staat.

Voorbeelduitvoer

Met de standaardinstellingen (spaties, inspringgrootte 4, LF, utf-8) en de twee secties die alvast voor je zijn aangevinkt, genereert de tool:

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

Vink Python, Go of YAML aan en de bijbehorende sectie verschijnt eronder, meteen met de conventie die de formatter van dat ecosysteem afdwingt.

Belangrijkste richtlijnen

Richtlijn Toegestane waarden Opmerkingen
root true Zet dit in de hoofdmap van het project, zodat het zoeken daar stopt
charset latin1, utf-8, utf-8-bom, utf-16be, utf-16le utf-8 is de gebruikelijke keuze. De specificatie raadt de byte order mark af, en de twee utf-16-varianten gelden voor elk bestand, en zulke bestanden kunnen de meeste buildtools niet lezen
end_of_line lf, crlf, cr lf voor cross-platform werk; crlf alleen voor repository’s die uitsluitend op Windows draaien
indent_style space, tab
indent_size een geheel getal, of tab Met indent_style = tab wordt de waarde niet genegeerd: tab_width valt erop terug, dus die waarde bepaalt hoe breed een tab oogt
tab_width een geheel getal Zelden nodig, want standaard gelijk aan indent_size
insert_final_newline true, false Houdt bestanden POSIX-conform en diffs rustig
trim_trailing_whitespace true, false Uitzetten voor Markdown, waar spaties aan het regeleinde een regelafbreking betekenen
max_line_length een positief geheel getal, of unset Staat niet in de kernspecificatie, maar in de properties-wiki. Wil je geen limiet, laat de regel dan weg in plaats van 0 te schrijven

Drie regels die een build breken, niet alleen een stijlgids

De meeste regels in een .editorconfig zijn voorkeuren. Deze drie niet, en juist daarom is een sectie per taal de moeite waard:

  • YAML staat het tabteken niet toe om in te springen. Dat is een parseerfout, geen waarschuwing van een linter. Springt je project in met tabs en heb je GitHub Actions-workflows, Docker Compose-bestanden of Kubernetes-manifesten, dan moet de YAML-sectie de spaties terugzetten.
  • make eist een echte tab aan het begin van elke receptregel. Een spatie levert missing separator. Stop. op en de build valt stil. Daarom staan er in [{Makefile,makefile,GNUmakefile,*.mk}] meerdere schrijfwijzen: EditorConfig vergelijkt bestandsnamen hoofdlettergevoelig, en in repository’s komen zowel Makefile als makefile voor.
  • Een shellscript dat met CRLF is opgeslagen, draait niet. De kernel leest de carriage return als onderdeel van het pad naar de interpreter en meldt zoiets als /bin/bash^M: bad interpreter: No such file or directory. Windows-batchbestanden hebben het spiegelbeeld van dat probleem: cmd.exe zoekt goto en call :label op via een byte-offset, dus een .bat met alleen LF kan naar de verkeerde regel springen of halverwege stoppen, zonder ook maar één foutmelding.

Twee daarvan worden juist veroorzaakt door het globale blok in plaats van erdoor opgelost, en daarom houdt deze generator ze in de gaten. Kies je tabs zonder de YAML-sectie toe te voegen, of CRLF zonder de shell-sectie, dan maakt het bestand dat hij schrijft juist die bestanden kapot, ook al worden ze er nergens in genoemd. De generator meldt dat boven de uitvoer, in plaats van je het te laten ontdekken via een pipeline die faalt. Hetzelfde geldt voor de utf-16-tekensets: die gelden voor elk bestand in het project, en make, shell-interpreters en Python kunnen broncode die zo is opgeslagen niet lezen.

Taalconventies die deze generator schrijft

Taal of bestand Sectie Wat het instelt en waarom
JavaScript, TypeScript *.{js,jsx,mjs,cjs,ts,tsx} 2 spaties, de standaard van Prettier
JSON *.{json,jsonc} 2 spaties, de breedte die npm in package.json schrijft
HTML, CSS, templates *.{html,htm,css,scss,sass,less,vue,svelte} 2 spaties, en de ingesprongen Sass-syntaxis heeft ze nodig om te kunnen parsen
YAML *.{yml,yaml} 2 spaties, en spaties ook als het project tabs gebruikt
Python *.{py,pyi} 4 spaties, PEP 8 en Black
PHP *.php 4 spaties, PSR-12. WordPress gebruikt tabs en Drupal 2
Go {*.go,go.mod} Tabs, omdat gofmt met tabs inspringt
Rust *.rs 4 spaties, de standaard van rustfmt
Ruby {*.rb,*.rake,Gemfile,Rakefile} 2 spaties, de standaard van RuboCop
Java *.java 4 spaties, de conventies van Oracle. De Java-stijl van Google gebruikt er 2
Markdown *.{md,markdown} Behoudt spaties aan het regeleinde, waarmee Markdown een regelafbreking maakt
Makefile {Makefile,makefile,GNUmakefile,*.mk} Tabs, die make verplicht stelt
Shellscripts *.{sh,bash,zsh} LF, wat de rest van het project ook gebruikt
Windows-batch *.{bat,cmd} CRLF, omdat cmd.exe labels via een byte-offset opzoekt

Let op wat er niet in die tabel staat: regellengtes. PEP 8 zegt 79, Black zegt 88, PSR-12 houdt een zachte 120 aan en rustfmt zegt 100. Zet je een van die getallen in een taalsectie, dan overschrijft dat stilletjes de limiet die je voor het hele project hebt gekozen. Daarom laat de generator max_line_length alleen in het [*]-blok staan en houdt hij die getallen hier, waar je ze bewust kunt toepassen.

Ondersteunt jouw editor het?

Ingebouwde ondersteuning: VS Code, de IntelliJ-familie van JetBrains, Visual Studio, Sublime Text, Xcode en Notepad++. Vim, Emacs, Neovim en een handvol andere editors hebben een kleine plug-in nodig. Het bestand is gewone INI, dus linters en formatters kunnen het ook lezen; zo blijven Prettier en sommige language servers ermee in de pas lopen.

Veelgestelde vragen

In de hoofdmap van het project, met root = true bovenaan. Je kunt extra .editorconfig-bestanden in submappen zetten om specifieke paden te overschrijven; het zoeken loopt vanaf het bestand dat je bewerkt omhoog door de mappenstructuur en stopt bij de eerste root = true die het tegenkomt.

Vul 0 in bij dat veld, dan laat de generator max_line_length helemaal weg uit het bestand. De gedocumenteerde waarden voor die eigenschap zijn positieve getallen, plus het specificatiebrede unset, dat bestaat om een waarde uit een bovenliggend bestand ongedaan te maken. Dit is het bestand op het hoogste niveau, dus er valt niets ongedaan te maken en een ontbrekende regel zegt precies hetzelfde. Wat je niet moet schrijven is max_line_length = 0, zoals deze tool vroeger deed: de specificatie draagt plug-ins op om waarden die ze niet ondersteunen te negeren, dus een limiet van nul is geen limiet van nul, maar een regel die stilletjes niets doet.

Nee. EditorConfig regelt witruimte en regeleindes in elke editor, ook in de editors die je collega’s gebruiken en jij niet. Prettier en taalspecifieke linters nemen de diepere stijlregels voor hun rekening, zoals aanhalingstekens, puntkomma’s en afsluitende komma’s. Ze vullen elkaar aan, en Prettier leest je .editorconfig voor de basis.

Omdat YAML het tabteken helemaal niet toestaat om in te springen. Een workflow- of compose-bestand dat met tabs is ingesprongen, geeft een parseerfout voordat welke tool dan ook het te zien krijgt. De generator houdt je tabs overal elders aan en overschrijft alleen de YAML-sectie, en meldt dat boven het bestand zodra hij dat doet.

Zet end_of_line = crlf als Windows-tooling in de repository dat echt vereist. Meestal is lf hier de betere keuze, samen met een .gitattributes met * text=auto: dan normaliseert git de regeleindes bij het committen, terwijl elke checkout passend blijft voor het besturingssysteem.

Je keuzes bouwen het bestand op en worden tussen de stappen meegegeven in de paginalink, zodat je een configuratie kunt delen of als bladwijzer kunt bewaren. Nadat de pagina is gegenereerd, wordt er niets op onze servers bewaard.

Gerelateerde tools

Tool beschikbaar in andere talen