Generator EditorConfig

.editorconfig

Wybierz ekosystemy obecne w twoim repozytorium. Każdy z nich dodaje sekcję z regułami, których ten ekosystem wymaga.

Dalej

Plik .editorconfig w katalogu głównym repozytorium mówi każdemu nowoczesnemu IDE, jak ten projekt formatuje swoje pliki, i rozstrzyga spór tabulatory kontra spacje plik po pliku. Trudną częścią nie jest blok globalny, tylko sekcje dla poszczególnych języków: YAML w ogóle nie da się wciąć tabulatorem, make odrzuca wiersz z poleceniem zaczynający się od spacji, a skrypt powłoki zapisany z CRLF nie uruchamia się. Wybierz języki obecne w twoim repozytorium, a ten generator zapisze sekcję, której każdy z nich potrzebuje, z notatką obok wyjaśniającą, po co ta sekcja tam jest.

Jak zbudować .editorconfig

  1. 1

    Wybierz języki obecne w repozytorium

    JavaScript, JSON, HTML i CSS, YAML, Python, PHP, Go, Rust, Ruby, Java, Markdown, Makefile, skrypty powłoki i pliki wsadowe Windows. Każdy zaznaczony dodaje jedną sekcję.

  2. 2

    Ustaw reguły, które dziedziczy każdy plik

    Styl i rozmiar wcięcia, koniec linii, kodowanie, końcowy znak nowej linii, końcowe białe znaki i limit długości linii. Trafiają do bloku `[*]` na górze, a każda sekcja poniżej nadpisuje tylko to, czego jej język faktycznie potrzebuje.

  3. 3

    Przeczytaj, po co jest każda sekcja

    Tabela obok pliku wyjaśnia każdą zapisaną sekcję, więc przed commitem możesz usunąć te, których twój zespół nie chce.

  4. 4

    Skopiuj plik do katalogu głównego repozytorium

    Zapisz go jako `.editorconfig` obok swojego `.gitignore`. Edytory podchwycą go przy następnym otwieranym pliku; bez kroku budowania, bez konfigurowania wtyczek.

Co robi .editorconfig

Plik o nazwie .editorconfig w katalogu głównym projektu deklaruje konwencje formatowania. Edytory z obsługą EditorConfig (każde większe IDE i większość nowoczesnych edytorów tekstu) stosują te reguły przy otwarciu pliku. Wyszukiwanie wędruje w górę drzewa katalogów od edytowanego pliku i zatrzymuje się na pierwszym pliku, który mówi root = true.

Przykładowy wynik

Przy ustawieniach domyślnych (spacje, rozmiar wcięcia 4, LF, utf-8) i dwóch sekcjach zaznaczonych za ciebie generator zapisuje:

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

Zaznacz Python, Go albo YAML, a poniżej pojawi się pasująca sekcja, od razu z konwencją, którą wymusza formater tego ekosystemu.

Kluczowe dyrektywy

Dyrektywa Przyjmowane wartości Uwagi
root true Ustaw w katalogu głównym projektu, aby wyszukiwanie się tam zatrzymało
charset latin1, utf-8, utf-8-bom, utf-16be, utf-16le utf-8 to zwykły wybór. Specyfikacja odradza znacznik kolejności bajtów, a para utf-16 obowiązuje w każdym pliku, czego większość narzędzi budowania nie odczyta
end_of_line lf, crlf, cr lf do pracy wieloplatformowej; crlf tylko w repozytoriach wyłącznie pod Windows
indent_style space, tab
indent_size liczba całkowita albo tab Przy indent_style = tab nie jest ignorowana: tab_width przyjmuje wtedy jej wartość, więc to ona ustala szerokość tabulatora
tab_width liczba całkowita Rzadko potrzebna, bo domyślnie przyjmuje wartość indent_size
insert_final_newline true, false Pliki zostają zgodne z POSIX, a diffy czyste
trim_trailing_whitespace true, false Wyłącz dla Markdown, gdzie końcowe spacje oznaczają łamanie linii
max_line_length dodatnia liczba całkowita albo unset Nie ma jej w podstawowej specyfikacji; znajduje się w wiki właściwości. Aby nie mieć limitu, pomiń ten wiersz zamiast wpisywać 0

Trzy reguły, które psują build, a nie tylko przewodnik stylu

Większość wpisów w .editorconfig to preferencje. Te trzy nie są i właśnie dla nich warto mieć sekcje dla poszczególnych języków:

  • YAML zabrania tabulatora we wcięciach. To błąd parsowania, a nie ostrzeżenie lintera. Jeśli twój projekt wcina tabulatorami, a masz workflow GitHub Actions, pliki Docker Compose albo manifesty Kubernetes, sekcja YAML musi wymusić z powrotem spacje.
  • make wymaga dosłownego tabulatora na początku każdego wiersza z poleceniem w regule. Spacja daje missing separator. Stop. i build staje. Dlatego [{Makefile,makefile,GNUmakefile,*.mk}] wymienia kilka pisowni: EditorConfig dopasowuje nazwy plików z rozróżnianiem wielkości liter, a w repozytoriach są zarówno Makefile, jak i makefile.
  • Skrypt powłoki zapisany z CRLF nie uruchamia się. Jądro odczytuje znak powrotu karetki jako część ścieżki interpretera i zgłasza coś w rodzaju /bin/bash^M: bad interpreter: No such file or directory. Pliki wsadowe Windows mają problem odwrotny: cmd.exe szuka goto i call :label po przesunięciu bajtowym, więc plik .bat zapisany z samym LF może skoczyć do złego wiersza albo zatrzymać się w połowie, w ogóle bez błędu.

Dwa z tych problemów blok globalny raczej wywołuje, niż naprawia, i właśnie dlatego ten generator ich pilnuje. Jeśli wybierzesz tabulatory i nie dodasz sekcji YAML albo wybierzesz CRLF i nie dodasz sekcji skryptów powłoki, zapisany plik zepsuje tamte pliki, choć ani razu ich w nim nie widać. Generator mówi o tym nad wynikiem, zamiast pozwolić ci odkryć to dopiero na nieudanym buildzie. Tak samo jest z kodowaniami utf-16: obowiązują w każdym pliku projektu, a make, interpretery powłoki i Python nie potrafią czytać kodu zapisanego w ten sposób.

Konwencje języków, które zapisuje ten generator

Język lub plik Sekcja Co ustawia i dlaczego
JavaScript, TypeScript *.{js,jsx,mjs,cjs,ts,tsx} 2 spacje, domyślne ustawienie Prettiera
JSON *.{json,jsonc} 2 spacje, szerokość, jaką npm zapisuje w package.json
HTML, CSS, szablony *.{html,htm,css,scss,sass,less,vue,svelte} 2 spacje, a składnia wcięciowa Sass potrzebuje ich, żeby się sparsować
YAML *.{yml,yaml} 2 spacje, i spacje nawet wtedy, gdy projekt używa tabulatorów
Python *.{py,pyi} 4 spacje, PEP 8 i Black
PHP *.php 4 spacje, PSR-12. WordPress używa tabulatorów, a Drupal 2
Go {*.go,go.mod} Tabulatory, bo gofmt wcina tabulatorami
Rust *.rs 4 spacje, domyślne ustawienie rustfmt
Ruby {*.rb,*.rake,Gemfile,Rakefile} 2 spacje, domyślne ustawienie RuboCopa
Java *.java 4 spacje, konwencje Oracle’a. Styl Javy od Google’a używa 2
Markdown *.{md,markdown} Zachowuje końcowe białe znaki, bo tak Markdown zapisuje łamanie linii
Makefile {Makefile,makefile,GNUmakefile,*.mk} Tabulatory, których wymaga make
Skrypty powłoki *.{sh,bash,zsh} LF, niezależnie od reszty projektu
Pliki wsadowe Windows *.{bat,cmd} CRLF, bo cmd.exe szuka etykiet po przesunięciu bajtowym

Zwróć uwagę, czego w tej tabeli nie ma: długości linii. PEP 8 mówi 79, Black mówi 88, PSR-12 mówi miękkie 120, a rustfmt mówi 100. Wpisanie którejkolwiek z tych liczb do sekcji języka po cichu nadpisałoby limit wybrany dla całego projektu, więc generator zostawia max_line_length wyłącznie w bloku [*], a te liczby trzyma tutaj, gdzie możesz je zastosować świadomie.

Czy twój edytor to obsługuje?

Wsparcie natywne: VS Code, rodzina JetBrains IntelliJ, Visual Studio, Sublime Text, Xcode i Notepad++. Vim, Emacs, Neovim i kilka innych potrzebuje niewielkiej wtyczki. Plik to zwykły INI, więc czytają go też lintery i formatery, i właśnie dzięki temu Prettier oraz część serwerów językowych trzyma się tych samych reguł.

Najczęściej zadawane pytania

W katalogu głównym projektu, z root = true na górze. Możesz dodać kolejne pliki .editorconfig w podkatalogach, aby nadpisać konkretne ścieżki; wyszukiwanie wędruje w górę drzewa od edytowanego pliku i zatrzymuje się na pierwszym napotkanym root = true.

Ustaw pole na 0, a generator pominie max_line_length w pliku. Udokumentowane wartości tej właściwości to liczby dodatnie oraz unset, słowo kluczowe wspólne dla całej specyfikacji, które służy do anulowania wartości odziedziczonej z pliku nadrzędnego. To jest plik najwyższego poziomu, więc nie ma tu czego anulować, a brak wiersza mówi to samo. Nie należy natomiast wpisywać max_line_length = 0, co to narzędzie kiedyś robiło: specyfikacja każe wtyczkom ignorować nieobsługiwane wartości, więc limit zero nie jest limitem zero, tylko wierszem, który po cichu nic nie robi.

Nie. EditorConfig obejmuje białe znaki i końce linii w każdym edytorze, także w tych, których używają twoi koledzy z zespołu, a ty nie. Prettier i lintery specyficzne dla języka obsługują głębsze reguły stylu, takie jak cudzysłowy, średniki i końcowe przecinki. Te dwa rozwiązania się uzupełniają, a Prettier odczyta twój .editorconfig w kwestii podstaw.

Bo YAML w ogóle nie dopuszcza tabulatora we wcięciach. Plik workflow albo compose wcięty tabulatorami nie przechodzi parsowania, zanim jakiekolwiek narzędzie go zobaczy. Generator zostawia twoje tabulatory wszędzie indziej i nadpisuje wyłącznie sekcję YAML, a gdy to robi, mówi o tym nad plikiem.

Ustaw end_of_line = crlf, jeśli narzędzia Windows w repozytorium faktycznie tego wymagają. Lepszym wyborem zwykle jest lf tutaj plus .gitattributes z * text=auto, żeby git normalizował końce linii przy commicie, a checkouty pozostawały odpowiednie dla każdego systemu operacyjnego.

Twoje wybory budują plik i wędrują w adresie strony między krokami, więc możesz udostępnić konfigurację albo dodać ją do zakładek. Po wygenerowaniu strony nic nie jest przechowywane na naszych serwerach.

Powiązane narzędzia

Narzędzie jest dostępne w innych językach