EditorConfig - Padronizando características essenciais

Padronização de código, esse é um assunto que merece nossa atenção, afinal de contas, em um mundo onde o desenvolvimento colaborativo ganha cada vez mais força, temos desenvolvedores com paladares diferentes, ou seja, cada qual com seu leque de ferramentas favoritas. Essas ferramentas, em especial os editores de código, carregam seus conjuntos particulares de estilos, como indentar com Tab, 2 ou 4 espaços, incluir ou não linha em branco no final do arquivo ao salvar e assim por diante.
Esse comportamento imprevisível não é bom, isso quebra totalmente a padronização do código. Basicamente cada tecnologia (neste caso linguagem de programação) possui uma solução "particular" que resolve isso. Em um de meus posts anteriores apresentei o "Eslint com Prettier", que na ocasião tinha como foco a linguagem JavaScript. Mas vós trago o EditorConfig um "plugin" independente da tecnologia utilizada.
Post citado acima: "Node.js + Express + ES6 + Eslint + Prettier + Sucrase de forma simples e rápida - https://link.medium.com/hXLRA1cRU1"
Obs: ao longo deste post utilizarei o termo "editor de código" para me referir também as IDEs (Integrated Development Environment).
O que é o EditorConfig
Nada mais é do que um plugin que obriga o editor de código a seguir de forma prescrita os padrões macro essenciais de formatação configurados pelo usuário.
Em outras palavras, o editorConfig ajuda a estabelecer um estilo de código entre diferentes editores, independente da tecnologia utilizada.
Veja uma descrição traduzida do site oficial do projeto:
O EditorConfig ajuda a manter estilos de codificação consistentes para vários desenvolvedores que trabalham no mesmo projeto em vários editores e IDEs. O projeto EditorConfig consiste em um formato de arquivo para definir estilos de codificação e uma coleção de plugins de editor de texto que permitem aos editores ler o formato do arquivo e aderir aos estilos definidos. Os arquivos EditorConfig são facilmente legíveis e funcionam bem com os sistemas de controle de versão.
Instalando
Seu editor de código pode ter suporte nativo ao EditorConfig ou via instalação de plugin. A lista de editores suportados pela ferramenta pode ser encontrada no site oficial do projeto em: https://editorconfig.org.
É correto afirmar que os editores mais famosos irão suportar essa ferramenta, seja de forma nativa ou via instalação de plugin. Caso seja necessário instalar o plugin, acesse a marketplace do seu editor, localize o plugin e instale (não requer configuração).
Exemplo utilizando o VSCode
Para instalar basta acessarmos a marketplace, pesquisar por editorconfig, clicar no resultado "EditorConfig for VS Code" e em seguida clicar em instalar, note que o meu já está instalado e ativo:

Utilizando
Apresentações devidamente feitas, vamos a utilização propriamente dita. Crie na raiz do seu projeto um arquivo .editorconfig
contendo as configurações que você deseja tornar padrões para o projeto corrente. Lembre-se de consultar a documentação oficial (https://editorconfig.org) para saber quais são as opções disponíveis.
No caso do VS Code e provavelmente do seu editor de código (caso seja diferente), o plugin do EditorConfig pode oferecer uma opção de geração automática do arquivo de regras. Basta clicar com o botão direito do mouse em um espaço vazio da área de arquivos e em Generate .editorConfig
:

O arquivo criado, em geral possui a seguinte estrutura:
root = true[*]
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = false
root = true
: o arquivo de configurações .editorConfig pode ser criado em qualquer local do projeto, logo o plugin irá aplicar as configurações aos arquivos de mesmo nível e níveis inferiores. Quando utilizamosroot = true
estamos orientando o plugin a não considerar outros eventuais arquivos de configuração;[*]
: indica que as definições daquele grupo serão aplicadas para todos os arquivos do nível atual e inferiores;indent_style = space
: define que a indentação será formada de espaços e não por um caracter de tabulação (tab), uma convenção universalmente adotada por desenvolvedores;indent_size = 4
: define que a indentação será composta por 4 espaços;charset = utf-8
: define o charset default dos arquivos como utf-8;trim_trailing_whitespace = false
: informa se o editor deve ou não apagar espaços em branco no final de cada linha. Pessoalmente recomendo que altere paratrue
;insert_final_newline = false
: informa se o editor deve ou não inserir uma linha em branco ao final de cada arquivo. Pessoalmente recomendo que altere paratrue
.
Meu .editorConfig padrão
Este é o conteúdo do meu .editorConfig default, ou seja, é o esqueleto incial que adoto em todos os meus projetos:
root = true[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
Regras disponíveis para o EditorConfig
O .editorConfig foi projetado para funcionar de forma macro, ou seja, independente da tecnologia, logo não espere por um conjunto de regras focado em uma linguagem especifica.
No link a seguir você encontrará o conjunto de regras e condicionais passiveis de configuração:
https://editorconfig-specification.readthedocs.io/en/latest/
Obs: Simples e objetivo!
Condicionando regras
Em alguns casos pode ser que determinada linguagem, arquivo ou diretório necessite de uma regra diferenciada. Isso é facil de resolver, veja os exemplos abaixo:
[*.{js,py}]
charset = utf-8
# Especifica as regras para arquivos com extensão .py
[*.py]
indent_style = space
indent_size = 4
# Define as regras para o arquivo Makefile
[Makefile]
indent_style = tab
# Regras para arquivos com extensão .js no diretório lib/
[lib/**.js]
indent_style = space
indent_size = 2
# Regra para os arquivos exatos package.json ou .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2
#
: esse caracter indica um comentário no arquivo.
Simples né. Observe que ao informar um arquivo exato basta passar o mesmo entre colchetes, já quando queremos especificar um conjunto de arquivos devemos informar estes entre colchetes e chaves, separando cada arquivo por virgula.