Convertir tabs a espacios
Un tabulador al inicio de la línea se convierte en 4 espacios, pero uno situado tras un carácter se convierte en 3: cada tabulador salta a la siguiente parada, así la alineación se conserva y el archivo queda solo con espacios. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Ejemplo resuelto
- Texto
- function hi() { return true; }
- Tamaño del tabulador
- 4
- Texto
- function hi() { return true; }
- Tabulaciones reemplazadas
- 1
- Espacios añadidos
- 4
- Caracteres antes
- 31
La mezcla de tabuladores y espacios es una de las disputas de estilo más frecuentes en equipos de software, y también una de las causas más silenciosas de diffs rotos, parches fallidos y linters de integración continua que rechazan el envío. Un conversor de tabs a espacios toma el texto fuente que aún contiene caracteres de tabulación y reescribe cada tab como espacios, de modo que las columnas visuales se mantienen y el archivo queda sangrado solo con espacios. Esta capacidad recorre cada línea de izquierda a derecha, avanza un contador de columna por cada carácter y, al encontrar un tab, inserta exactamente los espacios necesarios para alcanzar el siguiente tope de tabulador del ancho que usted elija. Se expanden tanto la sangría de bloque al inicio de línea como los tabs de alineación a mitad de línea. Los espacios ya presentes no se tocan, así que no se colapsan huecos intencionados de varios espacios.
Cómo los topes de tabulador expanden tabs a espacios sin perder alineación
Un carácter de tabulación no es un número fijo de espacios; es un salto hasta el siguiente múltiplo del tamaño de tab medido desde el inicio de la línea. Editores y terminales usan esa regla para que un tab tras una etiqueta corta y otro tras una larga caigan en la misma cuadrícula de columnas.
La sangría inicial escrita con uno o más tabs pasa a un múltiplo limpio de espacios, y los tabs en línea usados para alinear comentarios o listas de parámetros conservan sus columnas visuales en lugar de volverse un reemplazo tosco de cada tab por la misma racha fija de espacios. Los retornos de carro se conservan en archivos CRLF sin reiniciar la columna hasta el salto de línea, de modo que los finales de línea al estilo Windows no alteran la aritmética de columnas.
Dónde resulta útil pasar tabuladores a espacios
Los pipelines de estilo a menudo necesitan un paso de reescritura determinista antes de formateadores que asumen solo espacios, o tras importar desde editores que aún emiten tabs duros. Sitios de documentación y plataformas de retos de programación que aceptan entregas de alumnos pueden normalizar tabs en el servidor para que los autoevaluadores comparen archivos solo con espacios y no fallen por diferencias invisibles de tabulación.
Los equipos de contenido que posicionan por conversor de tabs a espacios se benefician de una ruta gratuita en el navegador que coincide byte a byte con la automatización de pago, de modo que marketing y runbooks de ingeniería no divergen. La validación fallida no consume saldo.
Qué puede hacer con ella
Tareas y entregas LMS
Normalice el código del alumno al subirlo para que los autoevaluadores comparen archivos solo con espacios y no fallen por tabs invisibles.
Preguntas frecuentes
¿Cómo expande el conversor de tabs a espacios cada tabulador?
Los tabs iniciales e internos se expanden así y se conserva la alineación visual.
¿Se eliminan o colapsan los espacios existentes?
No. Los caracteres de espacio existentes no se modifican.
¿Qué ocurre si el texto no tiene caracteres de tabulación?
Puede omitir reescribir el archivo cuando changed sea false.
¿Por qué un tabulador se convirtió en tres espacios y no en cuatro?
Porque un tabulador es un salto hasta la siguiente parada, no un bloque fijo de espacios. Con un ancho de 4, un tabulador colocado después de un carácter solo necesita tres espacios para llegar a esa parada.
¿Se conservan los finales de línea de Windows?
Sí. Los retornos de carro se mantienen tal cual y la cuenta de columnas solo se reinicia en el salto de línea, de modo que los archivos con finales de Windows salen con los mismos finales y bien alineados.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
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)Ejemplo de solicitud
{
"text": "function hi() {\n\treturn true;\n}"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.tabs_to_spaces",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Cómo los topes de tabulador expanden tabs a espacios sin perder alineación
Este conversor aplica la misma regla: mantiene un índice de columna con base cero que se reinicia en cada salto de línea, avanza uno por cada carácter ordinario (incluidos los espacios normales) y, al ver un tab, calcula n igual a tab_size menos la columna módulo tab_size, emite exactamente n espacios y avanza la columna en n. Por eso un tab en la columna cero con tab_size cuatro se convierte en cuatro espacios, mientras que un tab en la columna uno se convierte en tres, y un tab ya situado en un tope genera un tope completo nuevo de cuatro espacios. El algoritmo es un único pase de izquierda a derecha, sin anticipación, sin análisis de lenguaje y sin llamadas de red, de modo que la misma entrada produce siempre la misma salida en cada Worker y en el navegador.
Campos de entrada, forma de la respuesta, límites y errores de validación
Envíe un cuerpo JSON con el campo de cadena obligatorio text que contenga el código o el texto plano que desea normalizar. Se aceptan alias opcionales como input, code, source, content y body para la misma carga, de modo que formularios y scripts existentes renombran menos campos. El entero opcional tab_size fija el ancho del tope de tabulador; el valor predeterminado es cuatro, alineado con la mayoría de editores modernos y con guías de estilo de JavaScript, Python y Rust que esperan sangrías de cuatro o dos espacios una vez eliminados los tabs. Los valores válidos son enteros del uno al dieciséis inclusive; valores fuera de rango, no enteros, NaN e Infinity fallan con invalid_input nombrando tab_size. Si falta text, no es una cadena o está vacía, la petición falla con invalid_input y no se factura. La longitud máxima de entrada es de cien mil caracteres para que una sola llamada quepa en los presupuestos de memoria del Worker con archivos fuente habituales y fragmentos multiarchivo pequeños. En caso de éxito la respuesta incluye text, la cadena completamente expandida; tab_size, el ancho aplicado; tabs_replaced, cuántos caracteres tab se encontraron; spaces_added, el total de espacios insertados en su lugar; chars_before y chars_after, las longitudes antes y después; line_count, el número de líneas al partir por formas habituales de nueva línea; changed, booleano verdadero si se expandió al menos un tab; y message, un resumen breve de la reescritura. Si la entrada no tenía tabs, text se devuelve sin cambios, tabs_replaced es cero, changed es false y el mensaje indica que no se alteró nada para que usted pueda omitir la escritura del archivo.
Cuándo una API de tabs a espacios aporta valor en flujos reales
Scripts de migración que convierten en lote un repositorio legado de tabs a espacios pueden invocar el mismo contrato desde un bucle de shell o desde un Worker en el borde sin instalar módulos de Node en cada portátil. Como la implementación es parse puro de nivel A, cada llamada exitosa cuesta el precio base publicado $0.002 sin tokens de modelo ni red saliente. Mantenga las peticiones bajo el límite de caracteres, fije tab_size en su configuración y obtendrá código solo con espacios reproducible para CI, plugins LMS y lotes sin levantar un formateador consciente del lenguaje solo para un arreglo de sangría a nivel de carácter.
Casos de integración
Normalización de estilo en CI
Expanda tabs duros a espacios con un tab_size fijo antes de lint y formato para que los diffs sigan limpios y las herramientas que rechazan sangría mixta acepten el cambio.
Reescritura masiva de repositorios legados
Convierta en lote módulos sangrados con tabs a solo espacios vía la API, conservando tabs de alineación a mitad de línea como rachas de espacios correctas en columna.
Preguntas técnicas
¿Qué valores puedo usar para tab_size?
Cualquier entero del 1 al 16 inclusive. El valor predeterminado es 4. Valores fuera de ese rango o no enteros fallan con invalid_input y no se facturan.
¿Cuánto cuesta el conversor de tabs a espacios?
La herramienta en el navegador es gratuita. Las peticiones API usan saldo prepago de KIT a $0.002 por llamada exitosa; la entrada inválida no se factura.