Gerador de EditorConfig

.editorconfig

Escolha os ecossistemas presentes no seu repositório. Cada um adiciona uma seção com as regras de que aquele ecossistema precisa.

Próximo

Um .editorconfig na raiz do repositório informa a cada IDE moderna como este projeto formata seus arquivos, encerrando a discussão tabs vs espaços arquivo por arquivo. O difícil não é o bloco global, são as seções por linguagem: o YAML não aceita indentação com tabs de jeito nenhum, o make recusa uma linha de receita que comece com espaço, e um script de shell salvo com CRLF não roda. Escolha as linguagens do seu repositório e este gerador escreve a seção de que cada uma precisa, com uma nota ao lado explicando por que aquela seção está ali.

Como montar um .editorconfig

  1. 1

    Escolha as linguagens do seu repositório

    JavaScript, JSON, HTML e CSS, YAML, Python, PHP, Go, Rust, Ruby, Java, Markdown, Makefile, scripts de shell e arquivos batch do Windows. Cada opção marcada adiciona uma seção.

  2. 2

    Defina as regras que todos os arquivos herdam

    Estilo e tamanho de indentação, fim de linha, charset, nova linha final, espaços em branco no final da linha e o limite de colunas. Tudo isso vai no bloco `[*]` do topo, e cada seção abaixo sobrescreve apenas o que a linguagem dela realmente precisa.

  3. 3

    Veja por que cada seção está ali

    A tabela ao lado do arquivo explica cada seção que foi escrita, para você tirar as que o seu time não quer antes de fazer o commit.

  4. 4

    Copie para a raiz do repositório

    Salve como `.editorconfig` ao lado do seu `.gitignore`. Os editores passam a aplicá-lo já no próximo arquivo que você abrir; sem etapa de build, sem configurar plugin.

O que o .editorconfig faz

Um arquivo chamado .editorconfig na raiz de um projeto declara convenções de formatação. Editores com suporte a EditorConfig (todas as IDEs principais e a maioria dos editores de texto modernos) aplicam essas regras quando um arquivo é aberto. A busca sobe pela árvore de diretórios a partir do arquivo em edição e para no primeiro arquivo que diz root = true.

Exemplo de saída

Com as configurações padrão (espaços, tamanho de indentação 4, LF, utf-8) e as duas seções já marcadas para você, o gerador produz:

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

Marque Python, Go ou YAML e a seção correspondente aparece abaixo, já com a convenção que o formatador daquele ecossistema impõe.

Diretivas principais

Diretiva Valores aceitos Notas
root true Defina na raiz do projeto para que a busca pare ali
charset latin1, utf-8, utf-8-bom, utf-16be, utf-16le utf-8 é a escolha usual. A especificação desaconselha o BOM, e o par utf-16 vale para todos os arquivos, que a maioria das ferramentas de build não consegue ler
end_of_line lf, crlf, cr lf para trabalho multiplataforma; crlf só em repositórios exclusivos de Windows
indent_style space, tab
indent_size um número inteiro, ou tab Com indent_style = tab ele não é ignorado: tab_width recorre a ele, então é ele que define a largura visual de um tab
tab_width um número inteiro Raramente necessário, porque o padrão dele é o indent_size
insert_final_newline true, false Mantém os arquivos compatíveis com POSIX e os diffs limpos
trim_trailing_whitespace true, false Desligue no Markdown, onde espaços no final da linha significam uma quebra de linha
max_line_length um número inteiro positivo, ou unset Não está na especificação principal; ele vive na wiki de propriedades. Para não ter limite, deixe a linha de fora em vez de escrever 0

Três regras que quebram o build, não apenas o guia de estilo

A maioria das entradas de um .editorconfig é preferência. Estas três não são, e são elas que justificam ter uma seção por linguagem:

  • O YAML proíbe o caractere de tab na indentação. É um erro de parsing, não um aviso de linter. Se o seu projeto indenta com tabs e você tem workflows do GitHub Actions, arquivos do Docker Compose ou manifestos do Kubernetes, a seção YAML precisa forçar os espaços de volta.
  • O make exige um tab literal no início de cada linha de receita. Um espaço produz missing separator. Stop. e o build para. É por isso que [{Makefile,makefile,GNUmakefile,*.mk}] lista várias grafias: o EditorConfig compara nomes de arquivo diferenciando maiúsculas de minúsculas, e existem repositórios com Makefile e com makefile.
  • Um script de shell salvo com CRLF não roda. O kernel lê o retorno de carro como parte do caminho do interpretador e informa algo como /bin/bash^M: bad interpreter: No such file or directory. Os arquivos batch do Windows têm o problema espelhado: o cmd.exe localiza goto e call :label por deslocamento de bytes, então um .bat salvo apenas com LF pode pular para a linha errada ou parar no meio do caminho sem erro nenhum.

Duas dessas podem ser causadas pelo bloco global em vez de resolvidas por ele, e é por isso que este gerador fica de olho nelas. Se você escolher tabs e não adicionar a seção YAML, ou escolher CRLF e não adicionar a seção de shell, o arquivo gerado vai quebrar esses arquivos mesmo sem nunca citá-los. O gerador avisa isso acima da saída em vez de deixar você descobrir por um pipeline quebrado. O mesmo vale para os charsets utf-16: eles valem para todos os arquivos do projeto, e o make, os interpretadores de shell e o Python não conseguem ler código salvo assim.

Convenções de linguagem que este gerador escreve

Linguagem ou arquivo Seção O que define e por quê
JavaScript, TypeScript *.{js,jsx,mjs,cjs,ts,tsx} 2 espaços, o padrão do Prettier
JSON *.{json,jsonc} 2 espaços, a largura que o npm escreve no package.json
HTML, CSS, templates *.{html,htm,css,scss,sass,less,vue,svelte} 2 espaços, e a sintaxe indentada do Sass precisa deles para ser interpretada
YAML *.{yml,yaml} 2 espaços, e espaços mesmo quando o projeto usa tabs
Python *.{py,pyi} 4 espaços, PEP 8 e Black
PHP *.php 4 espaços, PSR-12. O WordPress usa tabs e o Drupal usa 2
Go {*.go,go.mod} Tabs, porque o gofmt indenta com tabs
Rust *.rs 4 espaços, o padrão do rustfmt
Ruby {*.rb,*.rake,Gemfile,Rakefile} 2 espaços, o padrão do RuboCop
Java *.java 4 espaços, as convenções da Oracle. O estilo Java do Google usa 2
Markdown *.{md,markdown} Mantém os espaços no final da linha, que é como o Markdown escreve uma quebra de linha
Makefile {Makefile,makefile,GNUmakefile,*.mk} Tabs, que o make exige
Scripts de shell *.{sh,bash,zsh} LF, independentemente do que o resto do projeto usa
Batch do Windows *.{bat,cmd} CRLF, porque o cmd.exe localiza rótulos por deslocamento de bytes

Repare no que não está nessa tabela: o comprimento de linha. A PEP 8 diz 79, o Black diz 88, a PSR-12 fala em 120 como limite flexível e o rustfmt usa 100. Escrever qualquer um desses números numa seção de linguagem sobrescreveria em silêncio o limite que você escolheu para o projeto inteiro, então o gerador mantém max_line_length apenas no bloco [*] e guarda esses números aqui, onde você pode aplicá-los de propósito.

O seu editor tem suporte?

Suporte nativo: VS Code, a família IntelliJ da JetBrains, Visual Studio, Sublime Text, Xcode e Notepad++. Vim, Emacs, Neovim e alguns outros precisam de um plugin pequeno. O arquivo é INI puro, então linters e formatadores também conseguem lê-lo, e é assim que o Prettier e alguns language servers se mantêm alinhados com ele.

Perguntas frequentes

Na raiz do projeto, com root = true no topo. Você pode adicionar outros arquivos .editorconfig em subdiretórios para sobrescrever caminhos específicos; a busca sobe pela árvore a partir do arquivo em edição e para no primeiro root = true que encontrar.

Coloque 0 no campo e o gerador deixa max_line_length fora do arquivo. Os valores documentados dessa propriedade são números positivos, mais o unset que vale para toda a especificação e existe para cancelar um valor herdado de um arquivo pai. Este é o arquivo de nível mais alto, então não há nada a cancelar e a ausência da linha diz a mesma coisa. O que você não deve escrever é max_line_length = 0, como esta ferramenta fazia antes: a especificação manda os plugins ignorarem valores que não suportam, então um limite de zero não é um limite de zero, é uma linha que silenciosamente não faz nada.

Não. O EditorConfig cuida de espaços em branco e fins de linha em todos os editores, inclusive nos que os seus colegas usam e você não. O Prettier e os linters específicos de cada linguagem cuidam de regras de estilo mais profundas, como aspas, ponto e vírgula e vírgulas finais. Os dois se complementam, e o Prettier lê o seu .editorconfig para o básico.

Porque o YAML não aceita o caractere de tab na indentação de jeito nenhum. Um arquivo de workflow ou de compose indentado com tabs falha no parsing antes que qualquer ferramenta chegue a lê-lo. O gerador mantém os seus tabs em todo o resto e sobrescreve apenas a seção YAML, e avisa isso acima do arquivo quando faz.

Defina end_of_line = crlf se alguma ferramenta Windows do repositório realmente exigir. A opção melhor costuma ser lf aqui mais um .gitattributes com * text=auto, assim o git normaliza no commit enquanto os checkouts continuam adequados para cada sistema operacional.

Suas escolhas montam o arquivo e viajam no link da página entre as etapas, para você compartilhar uma configuração ou guardá-la nos favoritos. Nada fica armazenado nos nossos servidores depois que a página é gerada.

Ferramentas relacionadas

Ferramenta disponível em outros idiomas