Converter tabs em espaços
Uma tabulação no início da linha vira 4 espaços, mas uma tabulação depois de um caractere vira 3: cada uma salta até a próxima parada, então o alinhamento se mantém e o arquivo fica só com espaços. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Exemplo resolvido
- Texto
- function hi() { return true; }
- Tamanho da tabulação
- 4
- Texto
- function hi() { return true; }
- Tabulações substituídas
- 1
- Espaços adicionados
- 4
- Caracteres antes
- 31
A mistura de tabulações e espaços é uma das disputas de estilo mais comuns em equipes de software e também uma das causas mais silenciosas de diffs quebrados, patches inválidos e linters de integração contínua que rejeitam o envio. Um conversor de tabs em espaços recebe o texto-fonte que ainda contém caracteres de tabulação e reescreve cada tab como espaços, de modo que as colunas visuais permaneçam iguais e o arquivo fique indentado só com espaços. Esta capacidade percorre cada linha da esquerda para a direita, avança um contador de coluna a cada caractere e, ao encontrar um tab, insere exatamente os espaços necessários para alcançar o próximo tab stop da largura que você escolher. Expandem-se tanto a indentação de bloco no início da linha quanto as tabs de alinhamento no meio da linha. Os espaços já presentes não são tocados, então lacunas intencionais de vários espaços não são colapsadas.
Como os tab stops expandem tabs em espaços sem perder o alinhamento
Um caractere de tabulação não é um número fixo de espaços; é um salto até o próximo múltiplo do tamanho de tab medido a partir do início da linha. Editores e terminais usam essa regra para que um tab após um rótulo curto e outro após um longo caiam na mesma grade de colunas.
A indentação inicial escrita com um ou mais tabs torna-se um múltiplo limpo de espaços, e as tabs em linha usadas para alinhar comentários ou listas de parâmetros mantêm suas colunas visuais em vez de virarem uma substituição bruta de cada tab pela mesma sequência fixa de espaços. Os caracteres de retorno de carro são preservados em arquivos CRLF sem reiniciar a coluna até o line feed, de modo que finais de linha no estilo Windows não atrapalhem a aritmética de colunas.
Quando converter tabulações em espaços vale a pena
Pipelines de estilo costumam precisar de um passo de reescrita determinística antes de formatadores que assumem só espaços, ou após importar de editores que ainda emitem tabs rígidas. Sites de documentação e plataformas de desafios de programação que aceitam envios de alunos podem normalizar tabs no servidor para que autoavaliadores comparem arquivos só com espaços e nunca falhem por diferenças invisíveis de tabulação.
Equipes de conteúdo que ranqueiam por conversor de tabs em espaços se beneficiam de um caminho gratuito no navegador que coincide byte a byte com a automação paga, para que marketing e runbooks de engenharia não divirjam. Validação falha não consome saldo.
Casos de uso
Tarefas e envios LMS
Normalize o código do aluno no upload para autoavaliadores compararem arquivos só com espaços e não falharem por caracteres tab invisíveis.
Perguntas frequentes
Como o conversor de tabs em espaços expande cada tabulação?
Tabs iniciais e internas expandem assim e o alinhamento visual se preserva.
E se o texto não tiver caracteres de tabulação?
Você pode pular regravar o arquivo quando changed for false.
Por que uma tabulação virou três espaços e não quatro?
Porque a tabulação é um salto até a próxima parada, não um bloco fixo de espaços. Com largura 4, uma tabulação logo depois de um caractere só precisa de três espaços para chegar à parada seguinte.
Qual largura de tabulação devo escolher?
Use a largura que o seu editor ou guia de estilo espera. O padrão é 4, o ajuste comum nos editores modernos, e qualquer número inteiro de 1 a 16 é aceito, então o estilo de dois espaços também funciona.
Os finais de linha do Windows são preservados?
Sim. Os retornos de carro ficam como estão e a contagem de colunas só recomeça na quebra de linha, então arquivos com finais do Windows saem com os mesmos finais e as colunas alinhadas.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/dev/tabs-to-spaces \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"function hi() {\n\treturn true;\n}"}'const res = await fetch("https://api.kit.forhosting.com/dev/tabs-to-spaces", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "function hi() {\n\treturn true;\n}"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/tabs-to-spaces",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "function hi() {\n\treturn true;\n}"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/tabs-to-spaces", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"function hi() {\\n\\treturn true;\\n}"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"function hi() {\n\treturn true;\n}"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/tabs-to-spaces", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"text": "function hi() {\n\treturn true;\n}"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.tabs_to_spaces",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Como os tab stops expandem tabs em espaços sem perder o alinhamento
Este conversor implementa a mesma regra: mantém um índice de coluna com base zero que reinicia a cada quebra de linha, avança um para cada caractere comum (incluindo espaços comuns) e, ao ver um tab, calcula n igual a tab_size menos a coluna módulo tab_size, emite exatamente n espaços e avança a coluna em n. Por isso um tab na coluna zero com tab_size quatro vira quatro espaços, enquanto um tab na coluna um vira três, e um tab já em um stop gera um stop completo novo de quatro espaços. O algoritmo é uma única passagem da esquerda para a direita, sem lookahead, sem parsing de linguagem e sem chamadas de rede, então a mesma entrada sempre produz a mesma saída em cada Worker e no navegador.
Campos de entrada, formato da resposta, limites e erros de validação
Envie um corpo JSON com o campo de string obrigatório text contendo o código ou o texto simples que deseja normalizar. Aliases opcionais como input, code, source, content e body são aceitos para a mesma carga, reduzindo renomeações em formulários e scripts existentes. O inteiro opcional tab_size define a largura do tab stop; o padrão é quatro, alinhado à maioria dos editores modernos e a guias de estilo de JavaScript, Python e Rust que esperam indentação de quatro ou dois espaços depois que as tabs saem. Valores válidos são inteiros de um a dezesseis inclusive; fora desse intervalo, não inteiros, NaN e Infinity falham com invalid_input citando tab_size. Texto ausente, não string ou string vazia falha com invalid_input e não é cobrado. O comprimento máximo de entrada é de cem mil caracteres para que uma chamada caiba no orçamento de memória do Worker em arquivos-fonte típicos e trechos multiarquivo pequenos. Em sucesso a resposta inclui text, a string totalmente expandida; tab_size, a largura aplicada; tabs_replaced, quantos caracteres tab foram encontrados; spaces_added, o total de espaços inseridos no lugar; chars_before e chars_after, os comprimentos antes e depois; line_count, o número de linhas ao dividir por formas comuns de nova linha; changed, booleano verdadeiro se ao menos um tab foi expandido; e message, um resumo breve da reescrita. Se a entrada não tinha tabs, text volta inalterado, tabs_replaced é zero, changed é false e a mensagem diz que nada mudou para que você possa pular a gravação do arquivo.
Quando uma API de tabs em espaços se paga em fluxos reais
Scripts de migração que convertem em lote um repositório legado de tabs para espaços podem chamar o mesmo contrato a partir de um loop de shell ou de um Worker na borda sem instalar módulos Node em cada laptop. Como a implementação é parse puro de nível A, cada chamada bem-sucedida custa o preço base publicado US$ 0,002 sem tokens de modelo e sem rede de saída. Mantenha as requisições abaixo do limite de caracteres, fixe tab_size na configuração e obtenha código só com espaços reprodutível para CI, plugins LMS e lotes offline sem levantar um formatador ciente de linguagem só para um ajuste de indentação em nível de caractere.
Casos de integração
Normalização de estilo no CI
Expanda tabs rígidas para espaços com um tab_size fixo antes do lint e do format para diffs limpos e ferramentas que rejeitam indentação mista aceitarem o envio.
Reescrita em massa de repositórios legados
Converta em lote módulos indentados com tabs para só espaços via API, preservando tabs de alinhamento no meio da linha como sequências de espaços corretas na coluna.
Perguntas técnicas
Quais valores posso usar para tab_size?
Qualquer inteiro de 1 a 16 inclusive. O padrão é 4. Valores fora desse intervalo ou não inteiros falham com invalid_input e não são cobrados.
Os espaços existentes são removidos ou colapsados?
Não. Caracteres de espaço existentes permanecem iguais. Apenas caracteres tab U+0009 são substituídos pela sequência de espaços exigida pela coluna atual e por tab_size.
Quanto custa o conversor de tabs em espaços?
A ferramenta no navegador é gratuita. Pedidos API usam saldo pré-pago do KIT a US$ 0,002 por chamada bem-sucedida; entrada inválida não é cobrada.