<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Markdown on kenji.blog</title><link>http://kenji.blog/es/tags/markdown/</link><description>Recent content in Markdown on kenji.blog</description><generator>Hugo -- gohugo.io</generator><language>es</language><copyright>kenjinote</copyright><lastBuildDate>Sun, 13 Sep 2026 02:00:00 +0900</lastBuildDate><atom:link href="http://kenji.blog/es/tags/markdown/index.xml" rel="self" type="application/rss+xml"/><item><title>Introducción al generador de sitios estáticos Hugo (Guía de migración desde WordPress)</title><link>http://kenji.blog/es/p/hugo-static-site-generator-wordpress-migration/</link><pubDate>Sun, 13 Sep 2026 02:00:00 +0900</pubDate><guid>http://kenji.blog/es/p/hugo-static-site-generator-wordpress-migration/</guid><description>&lt;img src="http://kenji.blog/p/hugo-static-site-generator-wordpress-migration/img/eyecatch.jpg" alt="Featured image of post Introducción al generador de sitios estáticos Hugo (Guía de migración desde WordPress)" />&lt;p>En el desarrollo web moderno y la gestión de blogs, la velocidad de carga de un sitio, su seguridad y su mantenibilidad son factores extremadamente importantes. Durante mucho tiempo, &amp;ldquo;WordPress&amp;rdquo;, que ha tenido una cuota de mercado abrumadora como base para blogs y sitios web corporativos, ha sido utilizado por muchos usuarios debido a su flexible ecosistema de plugins y su panel de administración intuitivo. Sin embargo, debido a que implica la comunicación con bases de datos y la generación dinámica de páginas en el lado del servidor (procesamiento con PHP), también enfrenta desafíos como la vulnerabilidad ante aumentos repentinos de tráfico y retrasos en la visualización (latencia).&lt;/p>
&lt;p>Por lo tanto, en los últimos años, los &amp;ldquo;Generadores de Sitios Estáticos&amp;rdquo; (SSG: Static Site Generator) se han popularizado rápidamente. En este artículo, profundizaremos en &amp;ldquo;&lt;strong>Hugo&lt;/strong>&amp;rdquo;, desarrollado en el lenguaje Go y conocido por su abrumadora velocidad de construcción entre los muchos SSG disponibles. Explicaremos exhaustivamente desde la comparación técnica de arquitectura con CMS (Sistemas de Gestión de Contenidos) dinámicos como WordPress, hasta los pasos concretos de migración, evaluación de rendimiento mediante modelos matemáticos, la estructura de directorios propia de Hugo y el orden de búsqueda de plantillas.&lt;/p>
&lt;hr>
&lt;h2 id="1-diferencias-técnicas-entre-un-cms-dinámico-wordpress-y-un-generador-de-sitios-estáticos-hugo">1. Diferencias técnicas entre un CMS dinámico (WordPress) y un generador de sitios estáticos (Hugo)
&lt;/h2>&lt;p>En el mecanismo de entrega de sitios web, WordPress y Hugo adoptan enfoques fundamentalmente diferentes.&lt;/p>
&lt;h3 id="11-arquitectura-de-wordpress-generación-dinámica">1.1 Arquitectura de WordPress (Generación dinámica)
&lt;/h3>&lt;p>WordPress es un claro ejemplo de CMS dinámico que ensambla páginas en el lado del servidor con cada solicitud. Cuando hay un acceso a una página por parte de un usuario (navegador), el servidor web (Apache, Nginx, etc.) ejecuta un script PHP y realiza consultas a una base de datos relacional como MySQL (o MariaDB). Combina el contenido obtenido de la base de datos (datos de artículos, categorías, etiquetas, configuración del sitio, etc.) con archivos de plantillas para generar el HTML final y devolverlo al cliente.&lt;/p>
&lt;p>Este mecanismo tiene la ventaja de poder generar contenido diferente para cada visitante en tiempo real (por ejemplo: carrito de compras de comercio electrónico, página exclusiva para usuarios que han iniciado sesión), pero consume intensamente los recursos del servidor a menos que se diseñe adecuadamente un mecanismo de caché (como proxy inverso o plugins).&lt;/p>
&lt;h3 id="12-arquitectura-de-hugo-generación-previa-en-tiempo-de-construcción">1.2 Arquitectura de Hugo (Generación previa en tiempo de construcción)
&lt;/h3>&lt;p>Por otro lado, como su nombre indica, Hugo, un &amp;ldquo;generador de sitios estáticos&amp;rdquo;, genera contenido en el &amp;ldquo;tiempo de construcción&amp;rdquo; y no en el &amp;ldquo;tiempo de solicitud&amp;rdquo;. El contenido no se mantiene en una base de datos, sino como archivos locales &amp;ldquo;Markdown&amp;rdquo; controlados por versiones con herramientas como Git.
Cuando un desarrollador ejecuta el comando (&lt;code>hugo&lt;/code>), Hugo lee los archivos Markdown, inyecta los datos en plantillas HTML especificadas (archivos de diseño) y genera un conjunto completo de archivos HTML/CSS/JS puros.&lt;/p>
&lt;p>Los archivos generados (activos estáticos) se pueden entregar simplemente colocándolos en &amp;ldquo;entornos de alojamiento estático&amp;rdquo; como Amazon S3, Cloudflare Pages, Netlify, Vercel o un simple servidor Nginx. Como no se requiere una base de datos ni un lenguaje de lado del servidor (como PHP), los riesgos de seguridad (inyección SQL, vulnerabilidades de PHP, etc.) disminuyen drásticamente, y la velocidad de entrega se acelera al máximo al ser almacenada en caché en nodos de borde de una CDN (Content Delivery Network).&lt;/p>
&lt;p>A continuación, ilustramos la diferencia entre las dos arquitecturas con un diagrama Mermaid.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
subgraph WordPress[&amp;#34;CMS Dinámico (WordPress)&amp;#34;]
direction TB
Req1[&amp;#34;Solicitud del usuario&amp;#34;] --&amp;gt; WebServer1[&amp;#34;Servidor web (Nginx/Apache)&amp;#34;]
WebServer1 --&amp;gt; PHP[&amp;#34;Entorno PHP&amp;#34;]
PHP &amp;lt;--&amp;gt; DB[&amp;#34;Base de datos (MySQL)&amp;#34;]
PHP --&amp;gt; HTML1[&amp;#34;Generación de HTML&amp;#34;]
HTML1 --&amp;gt; Res1[&amp;#34;Devolución de respuesta&amp;#34;]
end
subgraph Hugo[&amp;#34;Generador de Sitios Estáticos (Hugo)&amp;#34;]
direction TB
Dev[&amp;#34;Desarrollador / CI・CD&amp;#34;] --&amp;gt; HugoBuild[&amp;#34;Proceso de construcción de Hugo&amp;#34;]
Markdown[&amp;#34;Archivos Markdown&amp;#34;] --&amp;gt; HugoBuild
Templates[&amp;#34;Plantillas (HTML)&amp;#34;] --&amp;gt; HugoBuild
HugoBuild --&amp;gt; StaticFiles[&amp;#34;Archivos estáticos (HTML/CSS/JS)&amp;#34;]
StaticFiles --&amp;gt; CDN[&amp;#34;CDN / Alojamiento estático&amp;#34;]
Req2[&amp;#34;Solicitud del usuario&amp;#34;] --&amp;gt; CDN
CDN --&amp;gt; Res2[&amp;#34;Devolución de respuesta instantánea&amp;#34;]
end
&lt;/pre>
&lt;hr>
&lt;h2 id="2-evaluación-del-rendimiento-mediante-modelos-matemáticos">2. Evaluación del rendimiento mediante modelos matemáticos
&lt;/h2>&lt;p>Uno de los mayores beneficios de migrar de WordPress a Hugo es la mejora en el rendimiento (velocidad de carga). Para entender esto cuantitativamente, expresémoslo con un modelo matemático simple.&lt;/p>
&lt;p>El tiempo hasta que se completa la carga de una página (Load Time: $T_{load}$) se divide principalmente en el tiempo de respuesta del servidor (TTFB: Time To First Byte) y el tiempo de renderizado y obtención de recursos por parte del navegador ($T_{render}$).&lt;/p>
$$ T_{load} = T_{ttfb} + T_{render} $$&lt;p>En el caso de un CMS dinámico (WordPress), $T_{ttfb}$ es la suma de los siguientes elementos: latencia de la red ($T_{network}$), tiempo de ejecución del script del lado del servidor ($T_{php}$) y tiempo de procesamiento de consultas a la base de datos ($T_{db}$).&lt;/p>
$$ T_{ttfb\_wp} = T_{network} + T_{php} + T_{db} $$&lt;p>En un estado de accesos concentrados (alta carga), $T_{php}$ y $T_{db}$ aumentan de manera no lineal, y el sistema en su conjunto puede convertirse en un cuello de botella. Expresado en una fórmula, con respecto al número de solicitudes ($N$), se observa el siguiente deterioro en el tiempo de respuesta ($k$ es el coeficiente de sobrecarga de procesamiento).&lt;/p>
$$ T_{php}(N) \approx O(N^k), \quad T_{db}(N) \approx O(N^k) \quad \text{where } k > 1 $$&lt;p>Por otro lado, en una arquitectura que combina un generador de sitios estáticos (Hugo) y una CDN, no existe un procesamiento dinámico del lado del servidor (PHP o consultas DB). Dado que el contenido se almacena en caché en servidores de borde distribuidos por todo el mundo, $T_{ttfb}$ depende puramente de la latencia de la red desde el cliente hasta el servidor de borde más cercano ($T_{edge}$).&lt;/p>
$$ T_{ttfb\_hugo} = T_{edge} $$&lt;p>Con esto, se cumple $T_{edge} \ll (T_{network} + T_{php} + T_{db})$, y el TTFB se reduce drásticamente desde varios cientos de milisegundos a unas pocas decenas de milisegundos. Además, incluso si aumenta el número de solicitudes $N$, el tiempo de respuesta se mantiene casi constante ($O(1)$) debido a la función de equilibrio de carga de los servidores de borde.&lt;/p>
$$ \lim_{N \to \infty} T_{ttfb\_hugo}(N) \approx \text{Constant} $$&lt;p>Esta es la base matemática por la cual Hugo (un sitio estático) es extremadamente robusto contra picos de tráfico (como cuando el contenido se vuelve viral).&lt;/p>
&lt;hr>
&lt;h2 id="3-estructura-básica-y-principios-de-funcionamiento-de-hugo">3. Estructura básica y principios de funcionamiento de Hugo
&lt;/h2>&lt;p>Para dominar Hugo, es esencial comprender su estructura de directorios única y los conceptos de &amp;ldquo;Front Matter&amp;rdquo; y &amp;ldquo;Template Lookup Order&amp;rdquo; (Orden de búsqueda de plantillas).&lt;/p>
&lt;h3 id="31-explicación-detallada-de-la-estructura-de-directorios">3.1 Explicación detallada de la estructura de directorios
&lt;/h3>&lt;p>Cuando creas un nuevo proyecto de Hugo (&lt;code>hugo new site mysite&lt;/code>), se genera la siguiente estructura de directorios.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-text" data-lang="text">&lt;span class="line">&lt;span class="cl">mysite/
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── archetypes/ # Plantillas al crear nuevo contenido (esqueleto de Front Matter)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── assets/ # Archivos procesados por Hugo Pipes (SCSS/Sass, JavaScript, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── content/ # Contenido real del sitio (archivos Markdown). Esto reemplaza a la DB.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── data/ # Datos externos y configuración usados en todo el sitio (JSON, TOML, YAML, CSV, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── layouts/ # Plantillas HTML que determinan la apariencia del sitio (utiliza Go html/template)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── public/ # Lugar donde se generan los archivos estáticos después de ejecutar el comando build
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── static/ # Archivos estáticos publicados tal cual (imágenes, favicon, txt para robots, etc.)
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">├── themes/ # Directorio de temas de terceros o creados por uno mismo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">└── hugo.toml # Archivo de configuración global del sitio (anteriormente config.toml era la norma)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>En WordPress, el contenido se almacena en la tabla &lt;code>wp_posts&lt;/code> de MySQL, pero en Hugo todo se gestiona como archivos de texto (principalmente Markdown) dentro del directorio &lt;code>content/&lt;/code>. Esto facilita el control de versiones (Git) del contenido.&lt;/p>
&lt;h3 id="32-gestión-de-contenido-markdown-y-front-matter">3.2 Gestión de contenido: Markdown y Front Matter
&lt;/h3>&lt;p>Cada archivo de artículo de Hugo tiene un bloque de metadatos llamado &amp;ldquo;Front Matter&amp;rdquo; en la parte superior, seguido del texto principal (Markdown). Front Matter se puede escribir en TOML, YAML o JSON, pero YAML es ampliamente utilizado.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">title&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Comprendiendo la taxonomía de Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">date&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="ld">2026-09-13T10:00:00&lt;/span>&lt;span class="m">+09&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="m">00&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">draft&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">false&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">categories&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Explicación técnica&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Hugo&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;Go&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">aliases&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="s2">&amp;#34;/old-category/hugo-taxonomy/&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nn">---&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">A partir de aquí comienza el texto. Se escribe en **Markdown**.&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="l">Explicaremos las potentes funciones de Hugo...&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Aquí, un punto a destacar es la clave &lt;code>aliases&lt;/code>. Al migrar desde WordPress, si cambian los enlaces permanentes (URL), será una gran desventaja para el SEO. Si usas la función de alias de Hugo, con solo especificar la URL antigua, Hugo generará automáticamente el HTML de redireccionamiento (redirección mediante meta refresh). Es extremadamente útil, ya que no se requiere configuración de redirección en el lado del servidor (como .htaccess).&lt;/p>
&lt;h3 id="33-orden-de-búsqueda-de-plantillas-template-lookup-order">3.3 Orden de búsqueda de plantillas (Template Lookup Order)
&lt;/h3>&lt;p>Una de las potentes características de Hugo es su mecanismo flexible de búsqueda de plantillas (Template Lookup Order). Cuando Hugo renderiza una página específica, busca directorios y nombres de archivos en un orden particular para encontrar la mejor plantilla.&lt;/p>
&lt;p>Por ejemplo, al renderizar un artículo individual (Single Page) como &lt;code>content/post/hello-world.md&lt;/code>, Hugo busca el archivo de diseño aproximadamente en el siguiente orden:&lt;/p>
&lt;ol>
&lt;li>&lt;code>layouts/post/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>layouts/post/list.html&lt;/code> (no es un error, pero normalmente es para listas)&lt;/li>
&lt;li>&lt;code>layouts/_default/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>themes/&amp;lt;THEME_NAME&amp;gt;/layouts/post/single.html&lt;/code>&lt;/li>
&lt;li>&lt;code>themes/&amp;lt;THEME_NAME&amp;gt;/layouts/_default/single.html&lt;/code>&lt;/li>
&lt;/ol>
&lt;p>Los desarrolladores pueden &lt;strong>sobrescribir (override)&lt;/strong> las plantillas de un tema simplemente creando un archivo con el mismo nombre en el directorio &lt;code>layouts/&lt;/code> de su propio proyecto, sin tener que reescribir directamente el código fuente del tema. Esto permite aplicar personalizaciones propias sin obstaculizar la actualización del tema base.&lt;/p>
&lt;h3 id="34-taxonomía-taxonomy">3.4 Taxonomía (Taxonomy)
&lt;/h3>&lt;p>En Hugo, el sistema de clasificación equivalente a &amp;ldquo;Categorías&amp;rdquo; y &amp;ldquo;Etiquetas&amp;rdquo; de WordPress se llama &amp;ldquo;Taxonomía&amp;rdquo; (Taxonomy).
Hugo admite de forma predeterminada las taxonomías &lt;code>categories&lt;/code> y &lt;code>tags&lt;/code>, pero editando &lt;code>hugo.toml&lt;/code>, puedes agregar libremente taxonomías personalizadas (por ejemplo: &lt;code>series&lt;/code>, &lt;code>authors&lt;/code>, etc.).&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Ejemplo de hugo.toml&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">taxonomies&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">category&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;categories&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">tag&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;tags&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">series&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;series&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">author&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;authors&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Esto permite organizar y listar el contenido bajo diversas perspectivas.&lt;/p>
&lt;hr>
&lt;h2 id="4-proceso-de-migración-de-wordpress-a-hugo">4. Proceso de migración de WordPress a Hugo
&lt;/h2>&lt;p>La clave del éxito al migrar de WordPress a Hugo es cómo convertir el contenido dinámico de la base de datos en archivos estáticos limpios (Markdown + Front Matter) y mantener la estructura de URL existente.&lt;/p>
&lt;p>A continuación se muestra el flujo general de la canalización de migración.&lt;/p>
&lt;pre class="mermaid">
flowchart LR
WPDB[&amp;#34;Base de datos WP&amp;#34;] --&amp;gt;|Plugin| Exporter[&amp;#34;Herramienta de exportación&amp;#34;]
Exporter --&amp;gt;| Extrae texto, \nMetadatos, Imágenes | ZipFile[&amp;#34;Archivo Zip / Carpeta&amp;#34;]
ZipFile --&amp;gt;|Unpack| MarkdownFiles[&amp;#34;Archivos Markdown \n(content/)&amp;#34;]
ZipFile --&amp;gt;|Unpack| ImageFiles[&amp;#34;Imágenes \n(static/wp-content/)&amp;#34;]
MarkdownFiles --&amp;gt; Formatting[&amp;#34;Revisión y formato \n(Corregir Shortcodes)&amp;#34;]
Formatting --&amp;gt; Git[&amp;#34;Commit a Git&amp;#34;]
&lt;/pre>
&lt;h3 id="41-extracción-de-datos-y-conversión-a-markdown">4.1 Extracción de datos y conversión a Markdown
&lt;/h3>&lt;p>Para exportar datos de WordPress a Hugo, usar un plugin dedicado es el método más sencillo y seguro. Presentamos algunos enfoques representativos:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Uso del plugin Jekyll Exporter&lt;/strong>
Como Hugo tiene una estructura de datos muy similar a Jekyll, otro SSG, utilizar el plugin &amp;ldquo;Jekyll Exporter&amp;rdquo; para WordPress es una práctica común. Al instalar y ejecutar este plugin, todas las entradas y páginas estáticas se convierten a archivos Markdown con Front Matter y se pueden descargar como un archivo ZIP junto con los archivos de imagen.&lt;/li>
&lt;li>&lt;strong>Script propio usando la API de WordPress&lt;/strong>
Este método consiste en usar Python, Node.js, etc., para hacer llamadas a la API REST de WordPress (&lt;code>/wp-json/wp/v2/posts&lt;/code>), analizar los datos JSON y crear un script para generar archivos Markdown. Es eficaz para sitios que utilizan en gran medida campos personalizados complejos (como ACF) que los plugins no pueden manejar completamente.&lt;/li>
&lt;li>&lt;strong>Aprovechamiento de la herramienta wp2hugo&lt;/strong>
También hay un enfoque para usar herramientas CLI escritas en lenguajes como Go para convertir directamente desde el archivo XML de exportación de WordPress (WXR) al formato de Hugo.&lt;/li>
&lt;/ol>
&lt;h3 id="42-mantenimiento-de-la-estructura-de-enlaces-permanentes-url">4.2 Mantenimiento de la estructura de enlaces permanentes (URL)
&lt;/h3>&lt;p>Para heredar la evaluación de SEO, es extremadamente importante mantener la estructura de URL de la era de WordPress tal como está. Si habías configurado enlaces permanentes en WordPress como &lt;code>https://example.com/2026/09/13/my-post/&lt;/code>, debes especificar la estructura de enlaces permanentes en el archivo &lt;code>hugo.toml&lt;/code> de Hugo.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-toml" data-lang="toml">&lt;span class="line">&lt;span class="cl">&lt;span class="p">[&lt;/span>&lt;span class="nx">permalinks&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">post&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s2">&amp;#34;/:year/:month/:day/:slug/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Alternativamente, es posible fijar la URL de forma forzada especificando directamente el parámetro &lt;code>url&lt;/code> en el Front Matter de cada artículo.
Además, para las páginas cuyas URL cambiarán, configuras redirecciones usando los &lt;code>aliases&lt;/code> mencionados anteriormente.&lt;/p>
&lt;h3 id="43-conversión-de-shortcodes-códigos-cortos">4.3 Conversión de Shortcodes (códigos cortos)
&lt;/h3>&lt;p>Los shortcodes específicos de WordPress (por ejemplo: &lt;code>[gallery]&lt;/code>, &lt;code>[caption]&lt;/code>, códigos únicos de varios plugins) a menudo permanecen como cadenas de texto tras la exportación, por lo que es necesario abordarlos.
Estos se pueden eliminar por completo mediante scripts de reemplazo (sed o Python) o se pueden migrar utilizando la poderosa &lt;strong>función de shortcodes personalizados&lt;/strong> de Hugo (creando diseños propios en &lt;code>layouts/shortcodes/&lt;/code>) para que se rendericen adecuadamente en el lado de Hugo.&lt;/p>
&lt;hr>
&lt;h2 id="5-herramienta-cli-de-hugo-y-construcción--despliegue">5. Herramienta CLI de Hugo y construcción / despliegue
&lt;/h2>&lt;p>Una vez que se completan las tareas de migración, es hora de usar Hugo para construir el sitio y publicarlo para el mundo. Hugo, que se proporciona como un binario de Go, presume de una velocidad asombrosa, completando la construcción en unos pocos segundos incluso para sitios de miles a decenas de miles de páginas.&lt;/p>
&lt;h3 id="51-inicio-del-servidor-de-desarrollo-local">5.1 Inicio del servidor de desarrollo local
&lt;/h3>&lt;p>Cuando escribas artículos o ajustes el diseño, inicia el servidor local.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Comando de inicio del servidor de desarrollo (usa -D para incluir borradores)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo server -D
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Al ejecutar este comando, podrás previsualizar el sitio en &lt;code>http://localhost:1313/&lt;/code>. Hugo tiene una poderosa función integrada llamada &amp;ldquo;LiveReload&amp;rdquo;; en el momento en que edites y guardes un archivo Markdown, plantilla o CSS, la pantalla del navegador se actualizará automáticamente a alta velocidad. Como resultado, la experiencia de escritura y desarrollo se vuelve mucho más cómoda que el panel de administración de WordPress.&lt;/p>
&lt;h3 id="52-construcción-para-producción-y-optimización-de-rendimiento">5.2 Construcción para producción y optimización de rendimiento
&lt;/h3>&lt;p>Para generar archivos estáticos que se desplegarán en un entorno de producción, simplemente escribe &lt;code>hugo&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Ejecución de la compilación para producción. Minimiza HTML/CSS/JS con la opción --minify&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">hugo --minify
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Con este comando, los archivos de todo el sitio se generarán en el directorio &lt;code>public/&lt;/code>. Al agregar la opción &lt;code>--minify&lt;/code>, se eliminan los saltos de línea y espacios innecesarios, lo que reduce aún más el tamaño de los archivos. Esto contribuye directamente a reducir la latencia de la red ($T_{network}$) en el modelo matemático mencionado anteriormente.&lt;/p>
&lt;h3 id="53-automatización-del-despliegue-cicd">5.3 Automatización del despliegue (CI/CD)
&lt;/h3>&lt;p>Generar archivos estáticos localmente cada vez y subirlos por FTP, etc., es ineficiente. En las operaciones modernas de SSG, la mejor práctica es construir un entorno de CI/CD que realice automáticamente la construcción y el despliegue cuando se desencadena por un push a un repositorio Git (como GitHub).&lt;/p>
&lt;p>Por ejemplo, la forma básica de una configuración (archivo YAML) para implementar en Cloudflare Pages o GitHub Pages usando GitHub Actions es la siguiente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;span class="lnt">39
&lt;/span>&lt;span class="lnt">40
&lt;/span>&lt;span class="lnt">41
&lt;/span>&lt;span class="lnt">42
&lt;/span>&lt;span class="lnt">43
&lt;/span>&lt;span class="lnt">44
&lt;/span>&lt;span class="lnt">45
&lt;/span>&lt;span class="lnt">46
&lt;/span>&lt;span class="lnt">47
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="c"># Ejemplo de .github/workflows/hugo.yml&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy Hugo site to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">push&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">branches&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;main&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">workflow_dispatch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">permissions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">contents&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">read&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pages&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id-token&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">write&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">jobs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">build&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Checkout&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/checkout@v3&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">submodules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">recursive&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="c"># Si los temas se administran como submódulos&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">fetch-depth&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Setup Hugo&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">peaceiris/actions-hugo@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">hugo-version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;latest&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">extended&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">run&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">hugo --minify&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Upload artifact&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/upload-pages-artifact@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">with&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">path&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">./public&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">deploy&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">environment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">github-pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">url&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">${{ steps.deployment.outputs.page_url }}&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">runs-on&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ubuntu-latest&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">needs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">build&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">steps&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">name&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Deploy to GitHub Pages&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">id&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">deployment&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">uses&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">actions/deploy-pages@v2&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Configurándolo de esta manera, se completará un canal de automatización en el que solo con &amp;ldquo;escribir un artículo en Markdown y hacer Push a GitHub&amp;rdquo;, el sitio más reciente se publicará en el entorno de producción en unos pocos minutos.&lt;/p>
&lt;hr>
&lt;h2 id="6-beneficios-de-seo-y-operativos-tras-la-migración">6. Beneficios de SEO y operativos tras la migración
&lt;/h2>&lt;p>Los administradores de sitios que han completado la migración de WordPress a Hugo a menudo notan los tres siguientes beneficios significativos.&lt;/p>
&lt;h3 id="61-mejora-drástica-de-la-velocidad-del-sitio-y-los-core-web-vitals">6.1 Mejora drástica de la velocidad del sitio y los Core Web Vitals
&lt;/h3>&lt;p>Como resultado de eliminar las consultas a la base de datos y la renderización en el servidor, el tiempo de carga de la página se reduce a milisegundos. Esto se traduce directamente en una mejora masiva de las puntuaciones de &amp;ldquo;Core Web Vitals&amp;rdquo; (LCP, FID/INP, CLS), que son factores de clasificación de Google. Se puede esperar una reducción en la tasa de rebote de los usuarios y una mejora en la evaluación del SEO.&lt;/p>
&lt;h3 id="62-liberación-de-amenazas-de-seguridad">6.2 Liberación de amenazas de seguridad
&lt;/h3>&lt;p>Dado que WordPress se usa ampliamente en todo el mundo, siempre es objeto de ataques. Siempre existe el riesgo de manipulación de vulnerabilidades de plugins e intentos de inicio de sesión por ataques de fuerza bruta.
Sin embargo, un sitio estático generado por Hugo no tiene base de datos, entorno PHP ni pantalla de administración (formulario de inicio de sesión). No hay espacio para que un hacker ingrese al servidor y reescriba la base de datos, con lo que los riesgos de seguridad se acercan a cero al máximo.&lt;/p>
&lt;h3 id="63-operación-libre-de-mantenimiento">6.3 Operación libre de mantenimiento
&lt;/h3>&lt;p>La operación de WordPress requiere tareas de mantenimiento continuas, como la actualización del propio núcleo, la actualización de plugins y el seguimiento de las versiones de PHP. Siempre hay que temer el riesgo de que el sitio se rompa debido a problemas de compatibilidad.
En el caso de Hugo, solo necesitas actualizar la herramienta en sí cuando sea necesario, y dado que el código del sitio está compuesto de archivos de texto independientes, ofrece la abrumadora tranquilidad de saber que &amp;ldquo;no se romperá aunque lo dejes desatendido&amp;rdquo;.&lt;/p>
&lt;hr>
&lt;h2 id="7-resumen">7. Resumen
&lt;/h2>&lt;p>En este artículo, hemos explicado en detalle la migración de un CMS dinámico como WordPress al poderoso generador de sitios estáticos basado en Go, &amp;ldquo;Hugo&amp;rdquo;, abordando desde las diferencias de arquitectura técnica y la demostración matemática del rendimiento hasta los pasos de migración específicos.&lt;/p>
&lt;p>Migrar a un generador de sitios estáticos conlleva un costo inicial de aprendizaje (manejo de Git, sintaxis de Markdown, ejecución de comandos CLI en terminales, comprensión del funcionamiento del motor de plantillas), pero los beneficios compensan con creces mediante su &amp;ldquo;abrumadora velocidad de visualización&amp;rdquo;, &amp;ldquo;seguridad sólida&amp;rdquo; y la característica de ser &amp;ldquo;libre de mantenimiento&amp;rdquo;.&lt;/p>
&lt;p>Si tu sitio web no requiere cambios de diseño frecuentes ni procesos dinámicos complejos (como funciones exclusivas para miembros o características avanzadas de comercio electrónico) y su propósito es principalmente transmitir información (blogs, medios, sitios corporativos), migrar a Hugo será una de las inversiones técnicas más efectivas. Te animamos a usar este artículo como guía para dar tu primer paso en la operación de un sitio web de próxima generación con Hugo.&lt;/p></description></item><item><title>Blog técnico escrito en Markdown: Configuración del editor para duplicar la velocidad de escritura</title><link>http://kenji.blog/es/p/markdown-editor-setup-for-tech-blogs/</link><pubDate>Sat, 12 Sep 2026 12:00:00 +0900</pubDate><guid>http://kenji.blog/es/p/markdown-editor-setup-for-tech-blogs/</guid><description>&lt;img src="http://kenji.blog/p/markdown-editor-setup-for-tech-blogs/img/eyecatch.jpg" alt="Featured image of post Blog técnico escrito en Markdown: Configuración del editor para duplicar la velocidad de escritura" />&lt;p>Para escribir continuamente un blog técnico, es indispensable optimizar el entorno de escritura. En este artículo, profundizaremos en configuraciones avanzadas del editor para mejorar drásticamente la velocidad de escritura de un blog técnico utilizando Markdown. Explicaremos exhaustivamente desde la personalización extrema de Visual Studio Code (VS Code) y Neovim, el uso de fragmentos (snippets), la introducción de textlint como herramienta de revisión gramatical, la automatización en canalizaciones CI/CD, hasta las técnicas de escritura más vanguardistas utilizando LLM como GitHub Copilot.&lt;/p>
&lt;h2 id="1-modelo-matemático-para-mejorar-la-velocidad-de-escritura">1. Modelo matemático para mejorar la velocidad de escritura
&lt;/h2>&lt;p>Veamos primero con un modelo matemático simple cuánto impacta la optimización de la configuración del editor en el tiempo de escritura. Supongamos que el tiempo total de entrada al escribir un artículo de blog es $T_{total}$.&lt;/p>
$$
T_{total} = T_{think} + T_{type} + T_{format} + T_{review}
$$&lt;p>Aquí, $T_{think}$ es el tiempo de pensamiento, $T_{type}$ es el tiempo de escritura (tipeo), $T_{format}$ es el tiempo de ajuste de formato como Markdown, y $T_{review}$ es el tiempo de revisión y corrección.&lt;/p>
&lt;p>El tiempo ahorrado $T_{saved}$ mediante la personalización del editor (como la introducción de fragmentos y configuración de Linter) se puede expresar de la siguiente manera, utilizando el número de apariciones $N$ de un patrón específico (por ejemplo, shortcodes de Hugo o tablas de Markdown), el tiempo necesario para la entrada manual $t_{manual}$, y el tiempo necesario para la automatización mediante fragmentos, etc., $t_{snippet}$.&lt;/p>
$$
T_{saved} = \sum_{i=1}^{k} N_i \times (t_{manual, i} - t_{snippet, i}) + T_{review\_saved}
$$&lt;p>Además, al introducir herramientas de formateo automático o de Lint, el tiempo de confirmación visual humano $T_{review}$ se reduce considerablemente. Maximizar este $T_{saved}$ es precisamente el objetivo de este artículo.&lt;/p>
&lt;h2 id="2-la-configuración-definitiva-para-visual-studio-code-vs-code">2. La configuración definitiva para Visual Studio Code (VS Code)
&lt;/h2>&lt;p>VS Code es uno de los editores más populares actualmente y cuenta con un ecosistema de extensiones muy potente incluso para la escritura en Markdown.&lt;/p>
&lt;h3 id="extensiones-recomendadas">Extensiones recomendadas
&lt;/h3>&lt;p>Para acelerar la escritura, se recomienda encarecidamente instalar las siguientes extensiones.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Markdown All in One&lt;/strong>: Cuenta con todas las funciones básicas necesarias para escribir en Markdown, como poner en negrita o cursiva mediante atajos de teclado, continuación automática de listas y generación automática de la tabla de contenido (TOC).&lt;/li>
&lt;li>&lt;strong>markdownlint&lt;/strong>: Advierte en tiempo real sobre errores de sintaxis y violaciones de estilo en Markdown.&lt;/li>
&lt;li>&lt;strong>vscode-textlint&lt;/strong>: Aplica un conjunto de reglas orientado a documentos técnicos, previniendo inconsistencias y errores gramaticales.&lt;/li>
&lt;/ol>
&lt;h3 id="configuración-de-fragmentos-personalizados-para-hugo-markdownjson">Configuración de fragmentos personalizados para Hugo (&lt;code>markdown.json&lt;/code>)
&lt;/h3>&lt;p>Si estás utilizando generadores de sitios estáticos como Hugo o Docusaurus para tu blog técnico, es probable que ingreses Frontmatter o tus propios shortcodes con frecuencia. Usando la función de fragmentos (snippets) de VS Code, puedes desplegarlos en un instante.&lt;/p>
&lt;p>Selecciona &lt;code>Preferences: Configure User Snippets&lt;/code> desde la paleta de comandos y agrega la siguiente configuración en &lt;code>markdown.json&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;span class="lnt">23
&lt;/span>&lt;span class="lnt">24
&lt;/span>&lt;span class="lnt">25
&lt;/span>&lt;span class="lnt">26
&lt;/span>&lt;span class="lnt">27
&lt;/span>&lt;span class="lnt">28
&lt;/span>&lt;span class="lnt">29
&lt;/span>&lt;span class="lnt">30
&lt;/span>&lt;span class="lnt">31
&lt;/span>&lt;span class="lnt">32
&lt;/span>&lt;span class="lnt">33
&lt;/span>&lt;span class="lnt">34
&lt;/span>&lt;span class="lnt">35
&lt;/span>&lt;span class="lnt">36
&lt;/span>&lt;span class="lnt">37
&lt;/span>&lt;span class="lnt">38
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Hugo Frontmatter&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;frontmatter&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;title: \&amp;#34;${1:Título}\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;slug: \&amp;#34;${2:slug-name}\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;date: \&amp;#34;$CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE T$CURRENT_HOUR:$CURRENT_MINUTE:$CURRENT_SECOND+09:00\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;image: \&amp;#34;img/eyecatch.jpg\&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;math: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;mermaid: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;categories: [\&amp;#34;${3:Categoría}\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;tags: [\&amp;#34;${4:Etiqueta1}\&amp;#34;, \&amp;#34;${5:Etiqueta2}\&amp;#34;]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;${0}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Despliega el YAML Frontmatter para Hugo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Hugo Figure Shortcode&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;hfig&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;{{&amp;lt; figure src=\&amp;#34;${1:image.jpg}\&amp;#34; title=\&amp;#34;${2:Título de la imagen}\&amp;#34; &amp;gt;}}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Shortcode de Figure de Hugo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;Markdown Table&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prefix&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;mtable&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;body&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${1:Header 1} | ${2:Header 2} | ${3:Header 3} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| :--- | :---: | ---: |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${4:Row 1} | ${5:Data} | ${6:Data} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;| ${7:Row 2} | ${8:Data} | ${9:Data} |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;$0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;description&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;Genera una tabla Markdown de 3 columnas&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Con esta configuración, con solo escribir &lt;code>frontmatter&lt;/code> y presionar la tecla Tabulador, el YAML Frontmatter que incluye la hora actual se desplegará instantáneamente, aumentando drásticamente la velocidad inicial de escritura.&lt;/p>
&lt;h3 id="asistencia-de-escritura-con-github-copilot">Asistencia de escritura con GitHub Copilot
&lt;/h3>&lt;p>Cuando habilitas GitHub Copilot en VS Code, la autocompletación de IA sensible al contexto también funciona en Markdown. Especialmente en el caso de blogs técnicos, la IA predice y propone &amp;ldquo;la siguiente estructura a explicar&amp;rdquo; o &amp;ldquo;bloques de código relacionados&amp;rdquo;, lo que permite reducir significativamente el tiempo de escritura $T_{type}$.&lt;/p>
&lt;h2 id="3-personalización-extrema-en-neovim">3. Personalización extrema en Neovim
&lt;/h2>&lt;p>Aunque la interfaz gráfica (GUI) de VS Code es excelente, para los entusiastas de la terminal y los usuarios de Vim, Neovim es la opción más poderosa, ya que permite hacer todo sin soltar las manos del teclado.&lt;/p>
&lt;h3 id="arquitectura-lsp-de-neovim">Arquitectura LSP de Neovim
&lt;/h3>&lt;p>La arquitectura de LSP (Language Server Protocol) y Linter de Neovim en un entorno Markdown es la siguiente.&lt;/p>
&lt;pre class="mermaid">
classDiagram
class Neovim {
+&amp;#34;Búfer de texto&amp;#34;
+&amp;#34;Mapas de teclado&amp;#34;
}
class nvim_lspconfig {
+&amp;#34;marksman (LSP para Markdown)&amp;#34;
}
class null_ls_or_none_ls {
+&amp;#34;markdownlint&amp;#34;
+&amp;#34;textlint&amp;#34;
}
class LuaSnip {
+&amp;#34;Fragmentos dinámicos&amp;#34;
}
class CMP {
+&amp;#34;Motor de autocompletado&amp;#34;
}
Neovim --&amp;gt; nvim_lspconfig : &amp;#34;Proporciona funciones semánticas&amp;#34;
Neovim --&amp;gt; null_ls_or_none_ls : &amp;#34;Diagnósticos y formato&amp;#34;
Neovim --&amp;gt; CMP : &amp;#34;Solicitud de autocompletado&amp;#34;
CMP --&amp;gt; nvim_lspconfig : &amp;#34;Fuente LSP&amp;#34;
CMP --&amp;gt; LuaSnip : &amp;#34;Fuente de fragmentos&amp;#34;
&lt;/pre>
&lt;h3 id="despliegue-avanzado-de-fragmentos-usando-luasnip">Despliegue avanzado de fragmentos usando LuaSnip
&lt;/h3>&lt;p>Más potente que los fragmentos JSON de VS Code es el plugin para Neovim &lt;code>LuaSnip&lt;/code>. Utilizando la lógica de Lua, permite calcular y desplegar dinámicamente el contenido de los fragmentos.&lt;/p>
&lt;p>A continuación se muestra un ejemplo de configuración de LuaSnip que obtiene la fecha y hora actuales dinámicamente y despliega el Frontmatter de Hugo.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;span class="lnt">19
&lt;/span>&lt;span class="lnt">20
&lt;/span>&lt;span class="lnt">21
&lt;/span>&lt;span class="lnt">22
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-lua" data-lang="lua">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">ls&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;luasnip&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">s&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.snippet&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.text_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.insert_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">ls.function_node&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">-- Función para obtener la hora actual JST&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">local&lt;/span> &lt;span class="kr">function&lt;/span> &lt;span class="nf">get_current_date_jst&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span> &lt;span class="n">os.date&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;!%Y-%m-%dT%H:%M:%S&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">..&lt;/span> &lt;span class="s2">&amp;#34;+09:00&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kr">end&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">ls.add_snippets&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;markdown&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;frontmatter&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;title: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Título&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;slug: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;slug-name&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;date: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">f&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="kr">return&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="n">get_current_date_jst&lt;/span>&lt;span class="p">()}&lt;/span> &lt;span class="kr">end&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;image: &lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">img/eyecatch.jpg&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;math: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;mermaid: true&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;categories: [&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Categoría&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;tags: [&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Etiqueta&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="se">\&amp;#34;&lt;/span>&lt;span class="s2">]&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;---&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">s&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;mtable&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;| &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Encabezado 1&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; | &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Encabezado 2&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; |&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;|---|---|&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;| &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">3&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Celda 1&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; | &amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span> &lt;span class="n">i&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">4&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;Celda 2&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34; |&amp;#34;&lt;/span>&lt;span class="p">}),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>De esta manera, aprovechando el poder del lenguaje de programación (Lua), es posible crear fragmentos asombrosos que no solo contienen cadenas fijas, sino que también incrustan los valores de retorno de funciones, o aumentan y disminuyen dinámicamente el número de columnas de una tabla según la cantidad de caracteres ingresados.&lt;/p>
&lt;h2 id="4-análisis-estático-para-equilibrar-calidad-y-velocidad-de-escritura-textlint-y-expresiones-regulares">4. Análisis estático para equilibrar calidad y velocidad de escritura (textlint y expresiones regulares)
&lt;/h2>&lt;p>Para asegurar la calidad del blog, es necesario prevenir errores tipográficos e inconsistencias. Si esto se hace manualmente, $T_{review}$ aumentaría de manera explosiva, por lo que introduciremos el análisis estático usando &lt;code>textlint&lt;/code>.&lt;/p>
&lt;h3 id="introducción-a-textlint-y-el-conjunto-de-reglas-para-japonés">Introducción a textlint y el conjunto de reglas para japonés
&lt;/h3>&lt;p>Instalaremos textlint en un entorno de Node.js.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">npm install -D textlint textlint-rule-preset-ja-technical-writing textlint-rule-prh textlint-filter-rule-comments
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Crea un archivo &lt;code>.textlintrc.json&lt;/code> en la raíz del proyecto y configúralo de la siguiente manera.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-json" data-lang="json">&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;filters&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;comments&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;rules&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;preset-ja-technical-writing&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;ja-no-mixed-period&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;periodMark&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="s2">&amp;#34;。&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;sentence-length&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;max&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">},&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;prh&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;#34;rulePaths&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;./prh.yml&amp;#34;&lt;/span>&lt;span class="p">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Crea &lt;code>prh.yml&lt;/code> y define la inconsistencia de los términos técnicos. Por ejemplo, unifica &amp;ldquo;サーバー&amp;rdquo; (servidor) y &amp;ldquo;サーバ&amp;rdquo;, o &amp;ldquo;Javascript&amp;rdquo; y &amp;ldquo;JavaScript&amp;rdquo;.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">version&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">rules&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;JavaScript&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;Javascript&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;サーバー&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;サーバ&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">expected&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;インターフェース&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">pattern&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;インターフェイス&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Gracias a esto, cada vez que escribas en el editor, se te advertirá en tiempo real sobre las inconsistencias en la escritura, reduciendo el tiempo de corrección a casi cero.&lt;/p>
&lt;h3 id="patrones-estructurados-y-reemplazo-masivo-utilizando-expresiones-regulares">Patrones estructurados y reemplazo masivo utilizando expresiones regulares
&lt;/h3>&lt;p>Cuando migras artículos existentes a Markdown o traes texto de fuentes externas, el reemplazo masivo usando expresiones regulares resulta muy útil.&lt;/p>
&lt;p>Por ejemplo, la expresión regular para convertir la etiqueta HTML &lt;code>&amp;lt;b&amp;gt;énfasis&amp;lt;/b&amp;gt;&lt;/code> a &lt;code>**énfasis**&lt;/code> en Markdown:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Patrón de búsqueda&lt;/strong>: &lt;code>&amp;lt;b&amp;gt;(.*?)&amp;lt;/b&amp;gt;&lt;/code>&lt;/li>
&lt;li>&lt;strong>Patrón de reemplazo&lt;/strong>: &lt;code>**$1**&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Para combinar saltos de línea consecutivos innecesarios en uno solo:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Patrón de búsqueda&lt;/strong>: &lt;code>\n{3,}&lt;/code>&lt;/li>
&lt;li>&lt;strong>Patrón de reemplazo&lt;/strong>: &lt;code>\n\n&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>Al ejecutar esto con la función de búsqueda y reemplazo de VS Code (modo de expresiones regulares) o el comando &lt;code>%s&lt;/code> de Neovim (&lt;code>:%s/&amp;lt;b&amp;gt;\(.*?\)&amp;lt;\/b&amp;gt;/**\1**/g&lt;/code>), puedes unificar el formato al instante.&lt;/p>
&lt;h3 id="comprobación-automática-mediante-el-canal-pipeline-cicd">Comprobación automática mediante el canal (pipeline) CI/CD
&lt;/h3>&lt;p>Además, usando GitHub Actions, puedes construir una canalización CI que ejecute automáticamente textlint cuando subas (push) artículos al blog. Esto evita proactivamente el despliegue de artículos que infrinjan las reglas.&lt;/p>
&lt;pre class="mermaid">
flowchart TD
A[&amp;#34;Autor&amp;#34;] --&amp;gt;|Empujar cambios| B[&amp;#34;Repositorio de GitHub&amp;#34;]
B --&amp;gt; C{&amp;#34;GitHub Actions Activado&amp;#34;}
C --&amp;gt; D[&amp;#34;Checkout del repositorio&amp;#34;]
D --&amp;gt; E[&amp;#34;Configurar Node.js&amp;#34;]
E --&amp;gt; F[&amp;#34;npm install&amp;#34;]
F --&amp;gt; G[&amp;#34;Ejecutar textlint&amp;#34;]
G --&amp;gt;|Éxito| H[&amp;#34;Construir sitio Hugo&amp;#34;]
G --&amp;gt;|Fallo| I[&amp;#34;Informar error al PR/Commit&amp;#34;]
H --&amp;gt; J[&amp;#34;Desplegar en Hosting (Vercel/Netlify)&amp;#34;]
&lt;/pre>
&lt;h2 id="5-técnicas-de-escritura-en-markdown-en-la-era-de-los-llm">5. Técnicas de escritura en Markdown en la era de los LLM
&lt;/h2>&lt;p>En la redacción moderna de blogs técnicos, el uso de LLM (Grandes Modelos de Lenguaje) es inevitable. Al aprovechar las herramientas de IA integradas en el editor, la velocidad de escritura se duplica aún más.&lt;/p>
&lt;h3 id="ingeniería-de-prompts-dentro-del-editor">Ingeniería de prompts dentro del editor
&lt;/h3>&lt;p>Usando GitHub Copilot Chat en VS Code, o plugins como &lt;code>ChatGPT.nvim&lt;/code> o &lt;code>Copilot.vim&lt;/code> en Neovim, puedes lanzar prompts como los siguientes sin salir del editor.&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;Crea un esquema en estructura jerárquica de Markdown para principiantes sobre los siguientes elementos técnicos: Docker, Kubernetes, CI/CD&amp;rdquo;&lt;/p>
&lt;/blockquote>
&lt;p>De este modo, se generarán instantáneamente los encabezados y listas en Markdown. Solo tenemos que desarrollar y añadir contenido a esa estructura.&lt;/p>
&lt;p>Además, al darle instrucciones a la IA, también puede generar una sintaxis precisa para diagramas complejos de Mermaid y fórmulas matemáticas (LaTeX). Por ejemplo, la base de las fórmulas matemáticas y los diseños de diagramas de este artículo también se aceleró gracias a la escritura colaborativa (pair writing) con un LLM.&lt;/p>
&lt;h2 id="6-conclusión">6. Conclusión
&lt;/h2>&lt;p>En este artículo explicamos configuraciones del editor que duplicarán tu velocidad de escritura al crear un blog técnico en Markdown.&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Conciencia del modelo matemático&lt;/strong>: Erradicar el trabajo repetitivo para maximizar $T_{saved}$.&lt;/li>
&lt;li>&lt;strong>Aprovechar VS Code&lt;/strong>: Omitir la entrada manual utilizando extensiones y fragmentos en &lt;code>markdown.json&lt;/code>.&lt;/li>
&lt;li>&lt;strong>Personalización extrema de Neovim&lt;/strong>: Fragmentos dinámicos a través de &lt;code>LuaSnip&lt;/code> y control total mediante el teclado.&lt;/li>
&lt;li>&lt;strong>textlint y análisis estático&lt;/strong>: Integración de CI/CD y Linters locales para acercar el tiempo de revisión a cero.&lt;/li>
&lt;li>&lt;strong>Integración de LLM&lt;/strong>: Hacer que la IA genere directamente la estructura del Markdown y el código de diagramas o tablas dentro del editor.&lt;/li>
&lt;/ol>
&lt;p>Al incorporar estas configuraciones a tu propio entorno, desaparecerá lo &amp;ldquo;tedioso&amp;rdquo; de la escritura y, con seguridad, la cantidad y calidad de tus publicaciones técnicas mejorarán drásticamente. ¿Por qué no empezar hoy mismo registrando al menos un pequeño fragmento (snippet)?&lt;/p></description></item></channel></rss>