Gerador de EditorConfig
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
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
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
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
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
makeexige um tab literal no início de cada linha de receita. Um espaço produzmissing 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 comMakefilee commakefile. - 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: ocmd.exelocalizagotoecall :labelpor deslocamento de bytes, então um.batsalvo 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
Gerador de Cartão CSS
Crie o CSS de um contêiner de cartão: fundo, borda, raio dos cantos, espaçamento interno e sombra suave, com pré-visualização imediata e código para copiar e colar.
Conversor de Tamanho de Arquivo
Converta entre bytes, KB, MB, GB, TB e as unidades binárias IEC (KiB, MiB, GiB, TiB), combinando decimal e binário como preferir.
Conversor de base numérica
Converta números entre binário, octal, decimal, hexadecimal e qualquer base personalizada de 2 a 36, com o detalhamento posicional.
Gerador de Docker Compose
Gere um docker-compose.yml a partir de definições de serviços com imagem, portas e volumes, com padrões de boas práticas.
Visualizador de Markdown
Escreva Markdown e veja a renderização HTML atualizar ao vivo. Sintaxe com estilo GitHub, incluindo tabelas, listas de tarefas, blocos de código cercados e autolinks.
Gerador de README
Gere um README.md estruturado a partir de alguns campos: nome do projeto, tagline, recursos, comando de instalação, trecho de início rápido, autor e licença. Cole direto no seu repositório.
Ferramenta disponível em outros idiomas
- EditorConfig ジェネレーター [JA]
- EditorConfig-generator [NL]
- Generador de EditorConfig [ES]
- Trình tạo EditorConfig [VI]
- Generator EditorConfig [ID]
- EditorConfig-Generator [DE]
- EditorConfig-generator [SV]
- مولد EditorConfig [AR]
- Generator EditorConfig [PL]
- EditorConfig 생성기 [KO]
- เครื่องมือสร้าง EditorConfig [TH]
- Générateur EditorConfig [FR]
- EditorConfig Generator [EN]
- Generatore EditorConfig [IT]
- Генератор EditorConfig [RU]
- EditorConfig Oluşturucu [TR]
- EditorConfig 生成器 [ZH]