<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux Sin Humo (Publicaciones sobre vi/vim/neovim)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/vivimneovim.xml" rel="self" type="application/rss+xml"></atom:link><language>es</language><copyright>Contents © 2026 &lt;a href="mailto:sebelk@gmail.com"&gt;sebelk&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-NC-SA"
style="border-width:0; margin-bottom:12px;"
src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png"&gt;&lt;/a&gt;
</copyright><lastBuildDate>Mon, 20 Apr 2026 02:38:16 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Cómo migrar de vim-plug a lazy.nvim</title><link>https://sergiobelkin.com/posts/como-migrar-de-vim-plug-a-lazynvim/</link><dc:creator>sebelk</dc:creator><description>&lt;h3 id="introduccion"&gt;Introducción&lt;/h3&gt;
&lt;p&gt;Ya vimos &lt;a href="https://sergiobelkin.com/posts/como-convertir-tu-configuracion-de-initvim-a-initlua/"&gt;como convertir una una configuración en Vim script a Lua&lt;/a&gt;. Ese tipo de configuración es más flexible y reutilizaable. Ahora vamos por el paso final que es migrar de vim-plug a &lt;strong&gt;lazy.nvim&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="que-es-lazynvim"&gt;¿Qué es lazy.nvim?&lt;/h3&gt;
&lt;p&gt;Es un gestor de plugins escrito en Lua que sabe sacar provecho de la arquitectura moderna de Neovim.&lt;/p&gt;
&lt;h3 id="que-ventajas-y-funcionalidades-tiene-lazynvim"&gt;¿Qué ventajas y funcionalidades tiene lazy.nvim?&lt;/h3&gt;
&lt;p&gt;El gestor lazy.nvim se destaca por su rendimiento, usabilidad/UX y el modo de gestionar de plugins.&lt;/p&gt;
&lt;p&gt;En la siguiente tabla vemos como se destaca en cuento a &lt;strong&gt;Rendimiento&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Funcionalidad/Ventaja&lt;/th&gt;
&lt;th&gt;¿Qué significa?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inicio ultra rápido&lt;/td&gt;
&lt;td&gt;Arranca en segundos porque los módulos se precompilan y se cachean automáticamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instalaciones livianas&lt;/td&gt;
&lt;td&gt;Clona sólo lo esencial de los repos, ahorrando ancho de banda y espacio.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugins sin bloqueo del editor&lt;/td&gt;
&lt;td&gt;Tareas pesadas se ejecutan en segundo plano, manteniendo Neovim fluido.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Análisis de rendimiento&lt;/td&gt;
&lt;td&gt;Herramientas para medir tiempos de carga y optimizar tu configuración.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Carga bajo demanda (lazy-loading)&lt;/td&gt;
&lt;td&gt;Plugins se cargan solo cuando se necesitan, reduciendo carga inicial y memoria.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h5 id="que-y-donde-cachea-lazynvim"&gt;📝 ¿Qué y dónde cachea lazy.nvim?&lt;/h5&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Directorio&lt;/th&gt;
&lt;th&gt;Uso específico por &lt;code&gt;lazy.nvim&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.cache/nvim/luac/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cache de bytecode Lua&lt;/strong&gt;. Compila tu configuración en Lua a &lt;code&gt;.luac&lt;/code&gt;, para que Neovim no tenga que interpretarla cada vez.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.local/share/nvim/lazy/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Instalación real de los plugins&lt;/strong&gt;. Los plugins ya descargados no necesitan revalidarse ni reinstalarse.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;~/.local/state/nvim/lazy/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cache de estado&lt;/strong&gt;: versiones exactas de los plugins, commits, fechas, hashes. Así &lt;code&gt;lazy.nvim&lt;/code&gt; sabe si algo cambió.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="por-que-migrar-de-vim-plug"&gt;¿Por qué migrar de vim-plug?&lt;/h3&gt;
&lt;h4 id="los-numeros-duros"&gt;Los números duros&lt;/h4&gt;
&lt;p&gt;&lt;img alt="Tabla Comparativa de Repositorios lazy.vim vs vim-plug" src="https://sergiobelkin.com/images/Comparativa_lazy-plug.webp"&gt;&lt;/p&gt;
&lt;p&gt;La tabla de arriba muestra que&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si bien ambos son repositoorios populares, &lt;strong&gt;vim-plug&lt;/strong&gt; (que es un proyecto más longevo) supera a &lt;strong&gt;lazy.nvim&lt;/strong&gt; en este aspecto.&lt;/li&gt;
&lt;li&gt;Ambos proyectos están activos.&lt;/li&gt;
&lt;li&gt;El repo &lt;strong&gt;lazy.nvim&lt;/strong&gt; tiene más colaboradores.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En este aspecto salen bastante empatados.&lt;/p&gt;
&lt;h4 id="aspectos-ventajosos-desde-el-punto-de-vista-tecnico"&gt;Aspectos ventajosos desde el punto de vista técnico&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Para sysadmins: Rendimiento y carga mínima: se puede configurar de manera natural los plugins que realmente necesitás en tu entorno (por ejemplo, se pueden configurar plugins para que solamente se carguen al usar ssh) y una configuración más clara: todo en Lua, más fácil de mantener con backups dotfiles/scripts.&lt;/li&gt;
&lt;li&gt;Para desarrolladores: Carga por filetype y herramientas específicas y mayor control sobre dependencias y versiones.&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Funcionalidad&lt;/th&gt;
&lt;th&gt;vim-plug&lt;/th&gt;
&lt;th&gt;lazy.nvim&lt;/th&gt;
&lt;th&gt;Nota / Matiz&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gestión de plugins (install/update)&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Ambos permiten instalar, actualizar y remover plugins fácilmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lazy loading de plugins&lt;/td&gt;
&lt;td&gt;Sí (manual, limitado)&lt;/td&gt;
&lt;td&gt;Sí (declarativo y avanzado)&lt;/td&gt;
&lt;td&gt;vim-plug requiere configuración manual con &lt;code&gt;on&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;cmd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache de estado (lockfiles, hashes)&lt;/td&gt;
&lt;td&gt;Parcial (&lt;code&gt;:PlugSnapshot&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sí (&lt;code&gt;lazy-lock.json&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;vim-plug permite snapshot, pero no lo gestiona ni lo aplica automáticamente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache de bytecode Lua (.luac)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;lazy.nvim compila módulos Lua para acelerar el arranque&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arranque optimizado&lt;/td&gt;
&lt;td&gt;Parcial (con lazy manual)&lt;/td&gt;
&lt;td&gt;Sí (caching + carga bajo demanda)&lt;/td&gt;
&lt;td&gt;lazy.nvim acelera usando cache + lazy loading automático&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integración con configuración Lua&lt;/td&gt;
&lt;td&gt;No (Vimscript-first)&lt;/td&gt;
&lt;td&gt;Sí (nativo en Lua)&lt;/td&gt;
&lt;td&gt;vim-plug puede usarse con hacks en Lua, pero no está diseñado para eso&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="conceptos-fundamentales-para-usar-lazy"&gt;Conceptos fundamentales para usar lazy&lt;/h3&gt;
&lt;hr&gt;
&lt;h4 id="1-comentarios"&gt;1. Comentarios&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Esto es un comentario&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="2-variables"&gt;2. Variables&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nombre&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Neovim"&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;numero&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="3-tablas-como-diccionarios-o-listas"&gt;3. &lt;strong&gt;Tablas (como diccionarios o listas)&lt;/strong&gt;&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;opciones&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;number&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;relativenumber&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="4-funciones"&gt;4. &lt;strong&gt;Funciones&lt;/strong&gt;&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;saludar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hola desde Lua"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="5-requiriendo-otros-archivos-modularizacion"&gt;5. &lt;strong&gt;Requiriendo otros archivos (modularización)&lt;/strong&gt;&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"usuario.options"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"usuario.plugins.lazy"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;h3 id="ejemplo-concreto-de-migracion"&gt;Ejemplo concreto de migración&lt;/h3&gt;
&lt;p&gt;Usamos como punto de partida el archivo &lt;code&gt;~/.config/nvim/plugins.vim&lt;/code&gt; del &lt;a href="https://sergiobelkin.com/posts/como-convertir-tu-configuracion-de-initvim-a-initlua/"&gt;post anterior&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Camino a lazy.nvim" class="img-izquierda-responsiva" src="https://sergiobelkin.com/images/path-to-lazy.webp"&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c"&gt;"Plugins (Plug)&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; plug#begin&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'~/.vim/plugged'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

Plug &lt;span class="s1"&gt;'itchyny/lightline.vim'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'nyngwang/NeoTerm.lua'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'NLKNguyen/papercolor-theme'&lt;/span&gt;

&lt;span class="k"&gt;call&lt;/span&gt; plug#&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;lua&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&amp;lt;&lt;/span&gt; EOF                                                       
require&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"neo-term"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;.setup {
  exclude_filetypes &lt;span class="p"&gt;=&lt;/span&gt; { &lt;span class="s2"&gt;"oil"&lt;/span&gt; }
}                          
EOF

&lt;span class="nb"&gt;nnoremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F4&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; :NeoTermToggle&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
tnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F4&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;\&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;n&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;:NeoTermToggle&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
tnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Esc&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;\&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;n&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;:NeoTermEnterNormal&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="clonar-el-repo"&gt;Clonar el repo&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/folke/lazy.nvim.git&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/nvim/lazy/lazy.nvim
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="prepara-el-entorno"&gt;Prepara el entorno&lt;/h4&gt;
&lt;p&gt;Creamos un directorio para la configuración de los plugins y otro para la configuración de lazy.nvim:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;~/.config/nvim/lua/lplugins&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Aquí estarán los archivos de configuración de los plugins&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;~/.config/nvim/lua/config/
&lt;/pre&gt;&lt;/div&gt;

&lt;h4 id="configuracion-inicial"&gt;Configuración inicial&lt;/h4&gt;
&lt;p&gt;Partimos de este archivo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Cargamos módulos&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;commands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utils.commands'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;extracommands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utils.extracommands'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keymaps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'keymaps'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;opciones&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'opciones'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- Mantenemos por ahora la configuración de plugins en Vim script&lt;/span&gt;
&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'source ~/.config/nvim/plugins.vim'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y hacemos las siguientes modificaciones:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Cargamos módulos&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;commands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utils.commands'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;extracommands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utils.extracommands'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keymaps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'keymaps'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;opciones&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'opciones'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- Mantenemos por ahora la configuración de plugins en Vim script&lt;/span&gt;
&lt;span class="c1"&gt;-- vim.cmd('source ~/.config/nvim/plugins.vim')&lt;/span&gt;
&lt;span class="c1"&gt;-- require("config.lazy")&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;¿Qué hicimos? Deshabilitar vim-plug y &lt;strong&gt;por ahora&lt;/strong&gt; dejar comentada la línea que llamará al archivo &lt;code&gt;~/.config/nvim/lua/config/lazy.lua&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Luego en dicho archivo pondremos lo siguiente:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Bootstrap lazy.nvim&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lazypath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stdpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/lazy/lazy.nvim"&lt;/span&gt;
&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;uv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;fs_stat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lazypath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lazyrepo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/folke/lazy.nvim.git"&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;out&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--filter=blob:none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"--branch=stable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lazyrepo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;lazypath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;shell_error&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nvim_echo&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Failed to clone lazy.nvim:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ErrorMsg"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WarningMsg"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Press any key to exit..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getchar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;os.exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;opt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;rtp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;prepend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;lazypath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;-- Make sure to setup `mapleader` and `maplocalleader` before&lt;/span&gt;
&lt;span class="c1"&gt;-- loading lazy.nvim so that mappings are correct.&lt;/span&gt;
&lt;span class="c1"&gt;-- This is also a good place to setup other settings (vim.opt)&lt;/span&gt;
&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;mapleader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;
&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;maplocalleader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;-- Setup lazy.nvim&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"lazy"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- import your plugins&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lplugins"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;-- Configure any other settings here. See the documentation for more details.&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;-- colorscheme that will be used when installing plugins.&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;colorscheme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"habamax"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;-- automatically check for plugin updates&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;checker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="explicacion"&gt;Explicación&lt;/h5&gt;
&lt;h6 id="requirelazysetup"&gt;require("lazy").setup({ ... })&lt;/h6&gt;
&lt;p&gt;Es la función principal que inicia y configura los plugins en lazy.nvim.&lt;/p&gt;
&lt;h6 class=".." id="spec"&gt;spec =&lt;/h6&gt;
&lt;p&gt;Es el campo que indica &lt;strong&gt;la especificación de los plugins&lt;/strong&gt;. Es el lugar para definir qué plugins cargar.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nv"&gt;spec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lplugins.ui"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Cada &lt;code&gt;{ import = "..." }&lt;/code&gt; carga los plugins definidos en otros archivos lua.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;En este caso, usamoos una configuración modular:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;~/.config/nvim/lua/lplugins/ui.lua&lt;/code&gt; tendrá la especificación del plugin &lt;strong&gt;papercolor-theme&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.config/nvim/lua/lplugins/terminal.lua&lt;/code&gt; tendrá las especificaciones de los plugins &lt;strong&gt;lightline&lt;/strong&gt; y &lt;strong&gt;Neoterm&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="install-colorscheme-habamax"&gt;install = { colorscheme = { "habamax" } }&lt;/h6&gt;
&lt;p&gt;Establece un esquema de colores que se aplicará automáticamente en la interfaz del gestor de plugins.&lt;/p&gt;
&lt;h6 enabled id="checker"&gt;checker =&lt;/h6&gt;
&lt;p&gt;Activa el &lt;strong&gt;verificador automático de actualizaciones&lt;/strong&gt;. Cabe aclarar que esta configuración no los &lt;strong&gt;no los actualiza automáticamente&lt;/strong&gt;, pero te avisa para que los actualices mediante el comando en modo ex (&lt;code&gt;:Lazy update&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;En la configuración de partida teníamos solamente 3 plugins, pero decidimos dividirlos en dos categorías, a medida que vamos instalando más plugins podemos crear más archivos lua para clasificarlos.&lt;/p&gt;
&lt;h4 id="especificaciones-de-plugins"&gt;Especificaciones de plugins&lt;/h4&gt;
&lt;p&gt;Todos los archivos donde clasificás plugins deben tener la keyword return para que cada uno de ellos debe devuelva una tabla Lua con los plugins que querés que lazy.nvim cargue desde esos archivos.&lt;/p&gt;
&lt;p&gt;La siguiente es una plantilla de archivo en la cual se especifican plugins:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"autor/repositorio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;--  Reemplazá con el nombre del autor y nombre del repositorio&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- lazy = false,         --  true para carga diferida, false para cargar al inicio&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- priority = 1000,      --  Opcional. Útil para temas de colores&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- event = nil,          --  Reemplazá con evento si usás lazy = true (ej: "BufReadPre")&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- cmd = nil,            --  Reemplazá si querés cargar al ejecutar un comando&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- dependencies = {},    --  Lista de plugins que este necesita (si aplica)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- config = function()&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;-- Poné acá la configuración del plugin&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- end&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Para echar un poco de 💡 a esta cuestión de los campos:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Campo&lt;/th&gt;
&lt;th&gt;¿Obligatorio?&lt;/th&gt;
&lt;th&gt;¿Qué hace?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"autor/repositorio"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Identifica el plugin (por ejemplo &lt;code&gt;"NLKNguyen/papercolor-theme"&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;config = function()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No, pero común&lt;/td&gt;
&lt;td&gt;Configura el plugin al cargarlo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;lazy = true/false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;td&gt;Define si se carga de forma diferida o al inicio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;priority = número&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;td&gt;Da prioridad de carga (útil para temas de colores)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;event = "InsertEnter"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;td&gt;Carga el plugin al ocurrir cierto evento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cmd = "Comando"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;td&gt;Carga el plugin cuando se ejecuta un comando&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dependencies = {}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opcional&lt;/td&gt;
&lt;td&gt;Especifica otros plugins requeridos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Vamos a los &lt;strong&gt;ejemplos concretos 💪&lt;/strong&gt;&lt;/p&gt;
&lt;h5 id="archivo-uilua"&gt;Archivo ui.lua&lt;/h5&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"NLKNguyen/papercolor-theme"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;-- para que se cargue antes que otros&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;lazy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;-- para que se cargue en el arranque&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                       &lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"colorscheme PaperColor"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Esto significa:&lt;/p&gt;
&lt;p&gt;» Devuelvo una lista (tabla) con un solo plugin. Este plugin es NLKNguyen/papercolor-theme y quiero que se cargue al inicio, con prioridad alta, y que cuando se cargue, aplique el esquema de colores PaperColor.&lt;/p&gt;
&lt;h5 id="archivo-terminallua"&gt;Archivo terminal.lua&lt;/h5&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Plugin 1: lightline.vim&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"itchyny/lightline.vim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;lightline&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;colorscheme&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'solarized'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- &amp;lt;- podés cambiar por "jellybeans","OldHope", "wombat", "PaperColor", etc.&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Separador de items en la lista&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Plugin 2: NeoTerm.lua&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"nyngwang/NeoTerm.lua"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"neo-term"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nv"&gt;setup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;exclude_filetypes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"oil"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- evita que se use en buffers del tipo "oil"&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;-- Atajos de teclado:&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"n"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;F4&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;":NeoTermToggle&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;silent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;-- F4 en modo normal: alterna el terminal&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;F4&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;C-&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;lt;C-n&amp;gt;:NeoTermToggle&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;silent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;-- F4 en modo terminal: lo mismo&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"t"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;Esc&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;C-&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;&amp;lt;C-n&amp;gt;:NeoTermEnterNormal&amp;lt;CR&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;silent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Esc en terminal: pasa a modo normal&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;-- Separador final, no es obligatorio pero conveniente&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este archivo configura dos plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;lightline.vim&lt;/strong&gt;: para una línea de estado personalizada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NeoTerm.lua&lt;/strong&gt;: para trabajar con terminales flotantes o integrados, y define atajos con &lt;strong&gt;F4&lt;/strong&gt; y &lt;strong&gt;Esc&lt;/strong&gt; para manejarlos fácilmente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="habilitar-lazynvim"&gt;Habilitar lazy.nvim&lt;/h4&gt;
&lt;p&gt;Ya estamos casi listos, solamente falta quitar el comentario en el archivo &lt;code&gt;~/.config/nvim/init.lua&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"config.lazy"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Eso es todo, la próxima vez, al entrar al editor, &lt;strong&gt;lazy.nvim&lt;/strong&gt; se encargará de instalar los plugins especificados.&lt;/p&gt;
&lt;p&gt;Es importante ejecutar el comando &lt;code&gt;:checkhealth lazy&lt;/code&gt; el cual hará un diagnóstico de la instalación y configuración:&lt;/p&gt;
&lt;p&gt;&lt;img alt="checkhealth" src="https://sergiobelkin.com/images/checkhealthlazy.webp"&gt;&lt;/p&gt;
&lt;h3 id="sacandole-provecho-a-lazynvim"&gt;Sacándole provecho a lazy.nvim&lt;/h3&gt;
&lt;p&gt;Vamos a instalar el plugin &lt;a href="https://github.com/folke/which-key.nvim"&gt;which-key&lt;/a&gt; el cual sirve para mostrar de una manera amigable los atajos de teclado configurados.&lt;/p&gt;
&lt;p&gt;Editamos el archivo de configuración &lt;code&gt;~/.config/nvim/lua/lplugins/ui.lua&lt;/code&gt;siguiendo la plantilla mencionada anteriormente:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"NLKNguyen/papercolor-theme"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;priority&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;-- para que se cargue antes que otros&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;lazy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;-- para que se cargue en el arranque&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;                                                                                                                                       &lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"colorscheme PaperColor"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                  &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;                      &lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;                         &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"folke/which-key.nvim"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;event&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VeryLazy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;keys&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;ff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;edit ~/.config/nvim/init.lua&amp;lt;cr&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Edit init.lua"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;fr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;e #&amp;lt;cr&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Open recent file"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;tt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;terminal&amp;lt;cr&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Open terminal"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"which-key"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Buffer Local Keymaps"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;q"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;q&amp;lt;cr&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Quit"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;w"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;cmd&amp;gt;w&amp;lt;cr&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;desc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Save"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;-- Grupos visibles (aunque no hacen nada por sí mismos)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+file"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;leader&amp;gt;t"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+terminal"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Este plugin sirve para que al teclar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;kbd&gt;Espacio&lt;/kbd&gt;&lt;kbd&gt;f&lt;/kbd&gt;&lt;kbd&gt;f&lt;/kbd&gt;  Abrirá el archivo &lt;code&gt;/.config/nvim/init.lua&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;Espacio&lt;/kbd&gt;&lt;kbd&gt;f&lt;/kbd&gt;&lt;kbd&gt;r&lt;/kbd&gt;  Abrirá el archivo más reciente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;... y así con cada uno de los atajos definidos, pero además veremos una ayuda en pantalla.&lt;/p&gt;
&lt;p&gt;Vamos a verlo en acción:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Ejemplo usando which-key" src="https://sergiobelkin.com/images/ejemplo-wk.webp"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt; Al presionar &lt;code&gt;y&lt;/code&gt; ....&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt; Muestra que es &lt;strong&gt;Yank&lt;/strong&gt; que en el contexto de Vi/Vim/Neovim es copiar...&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3&lt;/code&gt; Aparecen automágicamente las teclas que pueden acompañar a este comando 💪 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y listo.... el resto es cuestión de usar la UI de Lazy, y familiarizarse con sus subcomandos en modo Ex.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Lazy UI" src="https://sergiobelkin.com/images/LazyUI.webp"&gt;&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusión&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Old but even new and fresh" class="img-izquierda-responsiva" src="https://sergiobelkin.com/images/oldButNEW.webp"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vim-plug&lt;/code&gt;&lt;/strong&gt; sigue siendo una opción robusta y popular, especialmente para usuarios de Vim clásico o entornos donde se necesita algo probado y ampliamente documentado.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sin embargo, &lt;strong&gt;&lt;code&gt;lazy.nvim&lt;/code&gt;&lt;/strong&gt; es una solución moderna y centrada en &lt;em&gt;Neovim&lt;/em&gt;, con alta participación comunitaria y buena agilidad en el mantenimiento. Ideal para setups nuevos o si des#eas aprovechar la asincronía y mejoras de Lua en Neovim.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Siempre que puedas&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consultá el &lt;code&gt;README&lt;/code&gt; oficial&lt;/li&gt;
&lt;li&gt;Buscá ejemplos en GitHub o Dotfiles de otros usuarios&lt;/li&gt;
&lt;li&gt;Explorá el código fuente si sabés Lua&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Estos tres artículos no han servidor para comenzar a usar Neovim, modernizar la configuración y utilizar un gestor de plugins nativo en Lua.
wSiempre que agregues un plugin, revisa su README y especifica las dependencias manualmente si no estás seguro. Lazy puede resolver muchas automáticamente, pero declararlas te da más control y claridad.&lt;/p&gt;
&lt;p&gt;Detrás de la fachada antigua, Neovim es un editor que adaptó su arquitectura a los nuevos tiempos.&lt;/p&gt;
&lt;p&gt;¡Felicitaciones si llegaste hasta acá?&lt;/p&gt;
&lt;h3 id="fuentes-y-mas-recursos"&gt;Fuentes y más recursos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://lazy.folke.io/usage"&gt;¿Cómo es el proceso de arranque de Neovim?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lazy.folke.io/usage"&gt;¿Cómo funciona y se usa Lazy.mvim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kaustubhpatange.medium.com/how-neovim-helped-improve-my-productivity-4214dd099340"&gt;How Neovim helped improve my productivity - Kaustubh Patange - Medium&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/como-migrar-de-vim-plug-a-lazynvim/</guid><pubDate>Sun, 01 Jun 2025 22:50:42 GMT</pubDate></item><item><title>¿Cómo convertir tu configuración de init.vim a init.lua?</title><link>https://sergiobelkin.com/posts/como-convertir-tu-configuracion-de-initvim-a-initlua/</link><dc:creator>sebelk</dc:creator><description>&lt;h3 id="requisitos"&gt;Requisitos&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Curiosidad&lt;/strong&gt;. Es la condición más importante para leer este post. Si la tendrás, con algo de esfuerzo sumado a algo de tiempo podrás aprender Vim, Neovim, etcº.&lt;/li&gt;
&lt;li&gt;Conocimientos básicos o intermedios de Vim y haber leído el &lt;a href="https://sergiobelkin.com/posts/una-introduccion-pragmatica-al-uso-de-plugins-en-neovim/"&gt;post anterior&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Conocimientos básicos de &lt;a href="https://github.com/junegunn/vim-plug"&gt;vim-plug&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="repaso-de-conceptos-importantes"&gt;Repaso de conceptos importantes&lt;/h3&gt;
&lt;p&gt;En el &lt;a href="https://sergiobelkin.com/posts/una-introduccion-pragmatica-al-uso-de-plugins-en-neovim/"&gt;post anterior&lt;/a&gt; vimos como un usuario de Vim puede comenzar a Neovim. En el presente artículo haremos la transición de &lt;strong&gt;Vim script&lt;/strong&gt;  a &lt;strong&gt;Lua&lt;/strong&gt;. Ok, booting the post 😄 ...&lt;/p&gt;
&lt;p&gt;&lt;img alt="De Vim script a Lua" class="img-izquierda-responsiva" src="https://sergiobelkin.com/images/bridge_with_Vim_script_Lua_web.webp"&gt;&lt;/p&gt;
&lt;p&gt;Recordemos que Vim usa &lt;strong&gt;Vim script&lt;/strong&gt; (aka VimL) como lenguaje de scripting nativo. Es un lenguaje específico que permite personalizar y extender su funcionalidad. Existe en dos formas: el Vim script tradicional (también llamado "legacy script") y Vim9script (introducido en Vim 9.0), que ofrece mejor rendimiento y una sintaxis más moderna. Sin embargo &lt;em&gt;Vim9script ni siquiera se usa de manera predeterminada en Vim 9.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lua&lt;/strong&gt;, en cambio, es un lenguaje de programación ligero, de alto nivel y multiparadigma, diseñado principalmente para ser incorporado en aplicaciones. Se destaca por su simplicidad, eficiencia y portabilidad. &lt;strong&gt;Neovim&lt;/strong&gt; incorporó Lua como lenguaje de scripting alternativo, lo que ha ganado popularidad debido a su mejor rendimiento y facilidad de uso comparado con Vim script tradicional.&lt;/p&gt;
&lt;p&gt;Cabe remarcar  que &lt;strong&gt;Neovim usa una implementación de Lua llamada LuaJIT&lt;/strong&gt;. LuaJIT es capaz de compilar código Lua a código máquina nativo durante la ejecución, lo que resulta en un rendimiento significativamente superior al intérprete estándar de Lua. LuaJIT es ampliamente reconocido por su alta velocidad, siendo en muchos casos comparable al rendimiento de lenguajes compilados como C. En el contexto de Neovim, LuaJIT permite que los scripts escritos en Lua se ejecuten con un rendimiento muy superior la de Lua estándar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diferencia de idiosincrasia:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vim script:&lt;/strong&gt; scripting lineal, global y directo. Bueno para pequeños ajustes, pero difícil de escalar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lua (Neovim):&lt;/strong&gt; lenguaje estructurado, orientado a modularizar, reusar y escalar. Favorece el uso de variables locales, tablas y funciones que mejoran el mantenimiento de la configuración.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Entonces:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Neovim usa LuaJIT para ejecutar configuraciones en Lua de forma rápida.&lt;/li&gt;
&lt;li&gt;Casi todas las instalaciones modernas de Neovim usan LuaJIT por defecto.&lt;/li&gt;
&lt;li&gt;Esto significa que los scripts y configuraciones Lua en Neovim corren a velocidades cercanas al código nativo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ventaja clave:&lt;/strong&gt;
Permite que Neovim con Lua sea mucho más rápido que Vim script o incluso &lt;strong&gt;Vim9script&lt;/strong&gt; en muchos casos.&lt;/p&gt;
&lt;h3 id="3-conceptos-esenciales-lo-minimo-que-siempre-debes-recordar"&gt;3 conceptos esenciales — lo mínimo que siempre debés recordar&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Por qué es esencial&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tablas (&lt;code&gt;table&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Todo en Lua usa tablas&lt;/strong&gt;. Opciones (&lt;code&gt;vim.o&lt;/code&gt;, &lt;code&gt;vim.opt&lt;/code&gt;), autocmds, comandos, mappings y configuraciones de plugins.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Variables locales (&lt;code&gt;local&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Permiten organizar el código, evitar errores y mejorar el rendimiento. Imprescindible para no contaminar el entorno global.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API de Neovim (&lt;code&gt;vim.api.*&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Es la manera oficial y flexible de interactuar con Neovim: crear comandos, autocmds, mappings y manipular el editor desde Lua.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Si entendés estos 3 conceptos, podés crear y mantener cualquier configuración básica y muchas avanzadas.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="que-es-una-tabla-y-que-no-en-la-configuracion-de-neovim-lua"&gt;¿Qué es una tabla y qué no en la configuración de Neovim (Lua)&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Tablas 🆗:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;vim.g&lt;/li&gt;
&lt;li&gt;vim.opt / vim.o&lt;/li&gt;
&lt;li&gt;vim.tbl_keys(...)&lt;/li&gt;
&lt;li&gt;Configuraciones de plugins&lt;/li&gt;
&lt;li&gt;Listas/patrones&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No son tablas ⚠ :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Funciones&lt;/li&gt;
&lt;li&gt;Comandos ejecutados&lt;/li&gt;
&lt;li&gt;Strings, números, booleanos&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="el-podio-de-las-tablas-madres-mas-importantes-en-neovim"&gt;El podio de las tablas madres más importantes en Neovim&lt;/h3&gt;
&lt;p&gt;Estas son las tres tablas raíz (madre) más importantes del entorno Lua en Neovim:&lt;/p&gt;
&lt;h4 id="vim"&gt;🏅  vim&lt;/h4&gt;
&lt;p&gt;Es la tabla principal y núcleo del entorno Lua en Neovim. Contiene todo lo necesario para interactuar con el editor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Subtablas como &lt;code&gt;vim.api&lt;/code&gt;, &lt;code&gt;vim.cmd&lt;/code&gt;, &lt;code&gt;vim.opt&lt;/code&gt;, &lt;code&gt;vim.g&lt;/code&gt;, &lt;code&gt;vim.fn&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;Siempre disponible sin necesidad de importar.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="_g"&gt;🥈 _G&lt;/h4&gt;
&lt;p&gt;Es la tabla global del lenguaje Lua. Desde aquí podés definir funciones o variables globales accesibles desde cualquier parte de tu configuración:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_G.mi_funcion = function() ... end&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;También contiene &lt;code&gt;vim&lt;/code&gt; como una de sus claves.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="package-de-lua"&gt;🥉 package (de Lua)&lt;/h4&gt;
&lt;p&gt;Maneja los módulos cargados por &lt;code&gt;require&lt;/code&gt;. Es crucial para modularizar tu configuración:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;package.loaded&lt;/code&gt; permite ver y recargar módulos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Nota&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tablas como &lt;code&gt;vim.api&lt;/code&gt;, &lt;code&gt;vim.opt&lt;/code&gt;, &lt;code&gt;vim.g&lt;/code&gt; son importantes, pero &lt;strong&gt;no son madres&lt;/strong&gt;: viven dentro de &lt;code&gt;vim&lt;/code&gt;. Lo mismo aplica para &lt;code&gt;math&lt;/code&gt;, &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;table&lt;/code&gt;, etc., que viven en &lt;code&gt;_G&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;→ Estas 3 (&lt;code&gt;vim&lt;/code&gt;, &lt;code&gt;_G&lt;/code&gt;, &lt;code&gt;package&lt;/code&gt;) forman la base del entorno ejecutable de cualquier configuración Neovim moderna en Lua.&lt;/p&gt;
&lt;h3 id="subtablas-mas-importantes"&gt;Subtablas más importantes&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tabla&lt;/th&gt;
&lt;th&gt;Contiene&lt;/th&gt;
&lt;th&gt;Ejemplo equivalente en Vim script&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vim.o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opciones globales&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set tabstop=4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vim.opt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opciones globales que contienen listas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set nf+=alpha&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vim.cmd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Comandos que se ejecutan en modo ex&lt;/td&gt;
&lt;td&gt;&lt;code&gt;colorscheme PaperColor&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vim.g&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Variables Globales&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let g:loaded_perl_provider =&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vim.keymap.set&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Asignación de atajos de teclado a una función o combinación de teclas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vim.keymap.set('n', 'ñ', ':wq&amp;lt;CR&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vim.api.nvim_create_user_command&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creación de comandos personalizados&lt;/td&gt;
&lt;td&gt;&lt;code&gt;command Nbuild execute 'w | Silent nikola build&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="diccionario-cruzado-vim-script-lua"&gt;Diccionario cruzado Vim script / Lua&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Vim script&lt;/th&gt;
&lt;th&gt;Lua&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Variable global&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let g:mi_var = 10&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vim.g.mi_var = 10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Variable local&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;(no hay una manera clara)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;local var = 10&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lista&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let lista = [1,2,3]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;lista = {1, 2, 3}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diccionario&lt;/td&gt;
&lt;td&gt;&lt;code&gt;let dict = {'a':1}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dict = {a = 1}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Función&lt;/td&gt;
&lt;td&gt;&lt;code&gt;function! Hola() ... end&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;function hola() ... end&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Función anónima&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;no hay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;function() ... end&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autocomando&lt;/td&gt;
&lt;td&gt;&lt;code&gt;autocmd BufWrite ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vim.api.nvim_create_autocmd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mapping&lt;/td&gt;
&lt;td&gt;&lt;code&gt;nnoremap&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vim.keymap.set&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comando&lt;/td&gt;
&lt;td&gt;&lt;code&gt;command ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vim.api.nvim_create_user_command&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="comparativa-de-conceptos-clave-vim-script-vs-lua"&gt;Comparativa de conceptos clave: Vim script vs Lua&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Vim script&lt;/th&gt;
&lt;th&gt;Lua (Neovim)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Variables y configuración&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Variables globales (&lt;code&gt;let g:var&lt;/code&gt;), &lt;code&gt;set&lt;/code&gt; para opciones&lt;/td&gt;
&lt;td&gt;Tablas (&lt;code&gt;vim.g&lt;/code&gt;, &lt;code&gt;vim.o&lt;/code&gt;, &lt;code&gt;vim.opt&lt;/code&gt;) y variables locales (&lt;code&gt;local&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automatización / lógica&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Funciones (&lt;code&gt;function!&lt;/code&gt;), comandos (&lt;code&gt;command&lt;/code&gt;), autocmds&lt;/td&gt;
&lt;td&gt;Funciones anónimas y definidas, &lt;code&gt;vim.api.*&lt;/code&gt;, autocmds con &lt;code&gt;vim.api.nvim_create_autocmd&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extensibilidad y estructura&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scripts planos, difícil modularizar&lt;/td&gt;
&lt;td&gt;Modularización con &lt;code&gt;require&lt;/code&gt;, &lt;code&gt;package.loaded&lt;/code&gt;, uso de archivos Lua por secciones&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="ejemplo-de-migracion-vim-script-lua"&gt;Ejemplo de migración Vim script → Lua&lt;/h3&gt;
&lt;p&gt;Bueno, con la  teoría suficiente, ✋✋ a la obra 😉. Supongamos que tenemos esta configuración de archivo init.vim:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;tabstop&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;nf&lt;/span&gt;&lt;span class="p"&gt;+=&lt;/span&gt;alpha

&lt;span class="nb"&gt;nnoremap&lt;/span&gt; ñ :&lt;span class="k"&gt;wq&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

command &lt;span class="p"&gt;-&lt;/span&gt;nargs&lt;span class="p"&gt;=+&lt;/span&gt; Silent execute &lt;span class="s1"&gt;'silent !&amp;lt;args&amp;gt;'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;redraw&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
command Nbuild execute &lt;span class="s1"&gt;'w | Silent nikola build'&lt;/span&gt;

&lt;span class="k"&gt;filetype&lt;/span&gt; plugin &lt;span class="k"&gt;on&lt;/span&gt;
runtime plugins.&lt;span class="k"&gt;vim&lt;/span&gt;
&lt;span class="k"&gt;colorscheme&lt;/span&gt; PaperColor
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Es un archivo pequeño, pero que sirve de punto de partida para moverse a una configuración en Lua.&lt;/p&gt;
&lt;h4 id="crear-el-entorno-para-neovim"&gt;Crear el entorno para Neovim&lt;/h4&gt;
&lt;p&gt;&lt;img alt="El sistema modular de Neovim" class="img-izquierda-responsiva" src="https://sergiobelkin.com/images/ElsistemamodulardeNeovim.webp"&gt;&lt;/p&gt;
&lt;p&gt;Como vimos en el post anterior, mi recomendación es comenzar con un archivo &lt;code&gt;init.vim&lt;/code&gt;. Una vez que ya estamos usando Neovim podemos realizar la migración &lt;code&gt;init.lua&lt;/code&gt;. Sin embargo, tenemos que crear los directorios para que Neovim guarde su configuración. Lo único que dejaremos por ahora en Vim script es la configuración de plugins con &lt;strong&gt;vim-plug&lt;/strong&gt;. Por lo tanto ejecutamos:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/.config/nvim/lua/utils
mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/.local/share/nvim/site/autoload
&lt;span class="c1"&gt;# Suponiendo que usabas un archivo para  &lt;/span&gt;
mv&lt;span class="w"&gt; &lt;/span&gt;~/.vim/autoload/plug.vim&lt;span class="w"&gt;  &lt;/span&gt;~/.local/share/nvim/site/autoload
&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;El directorio ~/.config/nvim es obligatorio.&lt;/li&gt;
&lt;li&gt;El directorio ~/.config/nvim/lua &lt;em&gt;no&lt;/em&gt; es obligatorio, pero es muy útil para modularizar la configuración de Neovim.&lt;/li&gt;
&lt;li&gt;Los nombres dados de los archivos y directorios dentroo de &lt;code&gt;~/.config/nvim/lua&lt;/code&gt; son totalmente arbitrarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En Neovim tendremos una estructura más modular. Si bien, podemos, tener, todo en &lt;code&gt;init.lua&lt;/code&gt;, vamos a aprovecharnos de esta configuración que es mucho más flexible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Archivo ~/.config/nvim/init.lua&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Cargamos nuestros módulos&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;commands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utils.commands'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;extracommands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utils.extracommands'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;keymaps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'keymaps'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;opciones&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'opciones'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="c1"&gt;-- Mantenemos por ahora la configuración de plugins en Vim script&lt;/span&gt;
&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'source ~/.config/nvim/plugins.vim'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Archivo ~/.config/nvim/keymaps.lua&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Alias&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;keymap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;set&lt;/span&gt;&lt;span class="w"&gt;                                                                         &lt;/span&gt;
&lt;span class="c1"&gt;-- maps&lt;/span&gt;
&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'n'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'ñ'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;':wq&amp;lt;CR&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Archivo ~/.config/nvim/lua/opciones.lua&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Alias&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;o&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;opt&lt;/span&gt;

&lt;span class="c1"&gt;-- Opciones&lt;/span&gt;
&lt;span class="nv"&gt;vo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;tabstop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="nv"&gt;vop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;nf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'alpha'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Archivo ~/.config/nvim/lua/utils/commands.lua&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Crea una tabla vacía para guardar funciones&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;M&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;command_or_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;nvim_del_user_command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nvim_create_user_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;command_or_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;-- Alias&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;create_command&lt;/span&gt;

&lt;span class="nf"&gt;com&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Silent'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'silent !'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;table.concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;fargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'redraw!'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;nargs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'+'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;com&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Nbuild'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'silent nikola build'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;


&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;M&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Archivo ~/.config/nvim/lua/utils/extracommands.lua&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c1"&gt;-- Alias&lt;/span&gt;
&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vcmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;cmd&lt;/span&gt;

&lt;span class="c1"&gt;-- Extra commands&lt;/span&gt;
&lt;span class="nf"&gt;vcmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'filetype plugin on'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;-- Esta configuración es innecesaria ya está en init.lua&lt;/span&gt;
&lt;span class="c1"&gt;-- vcmd('runtime plugins.vim')&lt;/span&gt;
&lt;span class="nf"&gt;vcmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'colorscheme PaperColor'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Archivo ~/.config/nvim/plugins.vim&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Este es el único archivo que lo dejamos en Vim script (con código Lua embebido incluido):&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c"&gt;"Plugins (Plug)&lt;/span&gt;
&lt;span class="k"&gt;call&lt;/span&gt; plug#begin&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'~/.vim/plugged'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

Plug &lt;span class="s1"&gt;'itchyny/lightline.vim'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'nyngwang/NeoTerm.lua'&lt;/span&gt;
Plug &lt;span class="s1"&gt;'NLKNguyen/papercolor-theme'&lt;/span&gt;

&lt;span class="k"&gt;call&lt;/span&gt; plug#&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;lua&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&amp;lt;&lt;/span&gt; EOF                                                       
require&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"neo-term"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;.setup {
  exclude_filetypes &lt;span class="p"&gt;=&lt;/span&gt; { &lt;span class="s2"&gt;"oil"&lt;/span&gt; }
}                          
EOF

&lt;span class="nb"&gt;nnoremap&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F4&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; :NeoTermToggle&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
tnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;F4&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;\&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;n&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;:NeoTermToggle&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
tnoremap &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;Esc&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;\&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;C&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="k"&gt;n&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;:NeoTermEnterNormal&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;CR&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Y Listo...&lt;/p&gt;
&lt;h4 id="explicacion"&gt;Explicación&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;¿Por qué definimos alias en los 3 archivos de módulos?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Los alias son básicamente variables. Los definimos porque este es un ejemplo de tipo "esqueleto" de configuración. Cuando comiences a agregar, más opciones, atajos de teclado y comandos personalizados, no querrás etipear tanto 😉.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Para qué agregamos la función &lt;code&gt;create_command&lt;/code&gt;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En Lua cuando usás la API de Neovim, si querés redefinir una función de un comando personalizado, tenés que borrarlo y volver definirlo, sino da error. Esto es para evitar sobreescrituras accidentales. Por eso creamos la función &lt;code&gt;create_command&lt;/code&gt; para que cuando redefinamos un comando lo hagamos de manera explícita.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Usa &lt;code&gt;pcall&lt;/code&gt; para borrar el comando personalizado y si no existe no da error. &lt;/li&gt;
&lt;li&gt;Vuelve a recrearlo con la nueva definición.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;¿Acaso el comando Nbuild hace lo mismo en Vim script que en Lua? Vamos a analizarlo.&lt;/p&gt;
&lt;h5 id="1-brevedad-vs-mantenibilidad"&gt;1. &lt;strong&gt;Brevedad vs mantenibilidad&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VimL:&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;vim
  command -nargs=+ Silent execute 'silent !&amp;lt;args&amp;gt;' | redraw!
  command Nbuild execute 'w | Silent nikola build'&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Es breve, directo y funciona. Pero:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Es poco &lt;strong&gt;expresivo&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;No permite &lt;strong&gt;manejar errores&lt;/strong&gt; fácilmente&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No escala bien con lógica compleja&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lua:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;lua
  com('Silent', function(opts)
    vim.cmd('silent !' .. table.concat(opts.fargs, ' '))
    vim.cmd('redraw!')
  end, { nargs = '+' })&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Es más verboso, sí, pero:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La función puede ser más compleja si se necesita&lt;/li&gt;
&lt;li&gt;Es &lt;strong&gt;programable&lt;/strong&gt; y &lt;strong&gt;reutilizable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Puede integrarse con condicionales, bucles, o lógica externa&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="2-control-de-errores-y-depuracion"&gt;2. &lt;strong&gt;Control de errores y depuración&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;En VimL: si un comando falla, tenés poco margen para capturar y manejar el error.&lt;/li&gt;
&lt;li&gt;En Lua: podés usar &lt;code&gt;pcall&lt;/code&gt;, &lt;code&gt;vim.notify&lt;/code&gt;, &lt;code&gt;vim.fn.systemlist&lt;/code&gt;, y &lt;strong&gt;construir mensajes personalizados o fallback&lt;/strong&gt; si algo sale mal.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;_&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;pcall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'silent !nikola build'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ok&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Error al ejecutar nikola build'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;levels&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="3-modularizacion"&gt;3. &lt;strong&gt;Modularización&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;En Lua podés agrupar comandos en módulos, con &lt;code&gt;require(...)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;En VimL tenés que recurrir a &lt;code&gt;runtime&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;, y no hay namespaces claros.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;commands&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'utils.commands'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;commands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_command&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Esto &lt;strong&gt;facilita dividir la configuración en archivos lógicos&lt;/strong&gt;, más fácil de leer, mantener y compartir.&lt;/p&gt;
&lt;h5 id="4-compatibilidad-futura-y-ecosistema-neovim"&gt;4. &lt;strong&gt;Compatibilidad futura y ecosistema Neovim&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Neovim ha declarado que Lua es su &lt;strong&gt;lenguaje de configuración nativo moderno&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La mayoría de los &lt;strong&gt;plugins modernos están escritos en Lua&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;VimL sigue siendo soportado, pero está &lt;strong&gt;siendo superado funcionalmente&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5 id="5-legibilidad-a-largo-plazo"&gt;5. &lt;strong&gt;Legibilidad a largo plazo&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Aunque VimL sea más corto, en un entorno de colaboración o con configuraciones grandes, Lua:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Es más &lt;strong&gt;explícito&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Permite &lt;strong&gt;documentar&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;La API de Neovim en Lua permite &lt;strong&gt;un uso más explícito y predecible de tipos de datos&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Es más &lt;strong&gt;fácil de extender&lt;/strong&gt; con lógica externa.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="conclusion"&gt;Conclusión&lt;/h3&gt;
&lt;p&gt;Si sabés migrar opciones, mappings, comandos y cargar plugins → podés convertir el 80% o más de tu &lt;code&gt;init.vim&lt;/code&gt; (equivalente el viejo &lt;code&gt;.vimrc&lt;/code&gt;) a &lt;code&gt;init.lua&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Migrar tu configuración de Neovim de Vim script a Lua no solo representa una mejora técnica inmediata, sino también una oportunidad para afilar tu pensamiento en términos de estructura, modularidad y optimización.&lt;/p&gt;
&lt;p&gt;Lua te invita a organizar tu configuración como un sistema flexible y componible, donde cada parte puede ser reutilizada, testeada y afinada con precisión. Este tipo de enfoque —más declarativo, más explícito— entrena tu mente en formas modernas de entender y construir software.&lt;/p&gt;
&lt;p&gt;A medida que domines la integración de herramientas, el manejo eficiente de datos y la automatización de tareas dentro de Neovim, estarás cultivando hábitos que trascienden tu editor: aprenderás a diseñar entornos complejos donde múltiples componentes cooperan de forma orquestada.&lt;/p&gt;
&lt;p&gt;Esa forma de pensar, de buscar la mejora continua y construir sistemas cada vez más elegantes y potentes, es lo que hoy distingue a los profesionales más relevantes del ecosistema tecnológico.&lt;/p&gt;
&lt;h3 id="apendice-los-10-conceptos-fundamentales-de-lua-resumen"&gt;Apéndice : Los 10 conceptos fundamentales de Lua (resumen)&lt;/h3&gt;
&lt;p&gt;Si querés profundizar, te propongo 7 conceptos extra para profundizar en el uso de Lua en Neovim:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concepto&lt;/th&gt;
&lt;th&gt;Descripción breve&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tablas (&lt;code&gt;table&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Estructuras clave-valor o listas. Base de toda la configuración.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Variables locales (&lt;code&gt;local&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Para mantener el código limpio y evitar contaminación global.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Funciones anónimas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Permiten definir acciones sin nombre, usadas en mappings, autocmds y comandos.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API de Neovim (&lt;code&gt;vim.api.*&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Puente entre Lua y Neovim: crear comandos, mappings, autocmds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vim.opt&lt;/code&gt; vs &lt;code&gt;vim.o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Para configurar opciones. &lt;code&gt;vim.o&lt;/code&gt; para valores simples, &lt;code&gt;vim.opt&lt;/code&gt; para manipular listas.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;require&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Para cargar módulos externos y dividir la configuración.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Paréntesis en llamadas&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Obligatorio usar &lt;code&gt;()&lt;/code&gt; al llamar funciones.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Referencias&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Asignar una tabla a otra variable sin copiarla (ejemplo: &lt;code&gt;local vg = vim.g&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;\_G (global)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tabla especial que contiene las variables y funciones globales accesibles en toda la configuración.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;package.loaded&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Permite ver o manipular qué módulos están cargados, útil para recargar configuraciones dinámicamente.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="fuentes-y-mas-recursos"&gt;Fuentes y más Recursos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://neovim.io/doc/user/lua.html"&gt;Lua en Neovim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://luascripts.com/neovim-lua"&gt;Mastering Neovim Lua: Quick Tips for Effortless Coding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/NeogitOrg/neogit"&gt;An interactive and powerful Git interface for Neovim, inspired by Magit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/tolomeo/a-pragmatic-approach-to-migrating-from-vscode-to-neovim-4fae"&gt;A pragmatic approach to migrating from VSCode to Neovim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://toxigon.com/how-to-use-neovim-in-linux"&gt;Mastering Neovim on Linux: A Step-by-Step Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sergiobelkin.com/posts/como-convertir-tu-configuracion-de-initvim-a-initlua/NeoVim%20Is%20Better,%20But%20Why%20Developers%20Aren't%20Switching%20To%20It?"&gt;NeoVim Is Better, But Why Developers Aren't Switching To It?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://markaicode.com/neovim-10-setup-ai-plugins-lsp/"&gt;NeoVim 10.0 Setup for 2025: AI Plugins and LSP Configuration&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/como-convertir-tu-configuracion-de-initvim-a-initlua/</guid><pubDate>Thu, 15 May 2025 19:01:18 GMT</pubDate></item><item><title>Una introducción pragmática al uso de plugins en Neovim</title><link>https://sergiobelkin.com/posts/una-introduccion-pragmatica-al-uso-de-plugins-en-neovim/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;Ya me he referido a Neovim alguna vez en el pasado: &lt;a href="https://sergiobelkin.com/posts/2017/11/20/lo-viejo-lo-bueno-y-lo-nuevo-en-neovim/"&gt;Lo viejo, lo bueno y lo nuevo en Neovim &lt;/a&gt;. 
Se pueden extender las funcionalidades de neovim, mediante plugins, de manera similar a las de su predecesor, el editor Vim. 
&lt;strong&gt;En este artículo propongo un modo muy sencillo y lo más transparente posible para el uso de plugins en Neovim.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hay dos tipos de plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Globales&lt;/strong&gt;: Funcionan para todo tipo de archivos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filetype&lt;/strong&gt;: Sirven para un tipo particular de archivos**.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El siguiente listado muestra plugins globales que forman parte del core de neovim:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;ls -l /usr/share/nvim/runtime/plugin&lt;/span&gt;
&lt;span class="n"&gt;total 60&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root  411 mar 26 10:48 editorconfig.lua&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root 3677 mar 26 10:48 gzip.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root  904 mar 26 10:48 man.lua&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root  138 mar 26 10:48 matchit.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root 7966 mar 26 10:48 matchparen.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root  152 mar 26 10:48 netrwPlugin.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root 2160 mar 26 10:48 osc52.lua&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root 2017 mar 26 10:48 rplugin.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root 1778 mar 26 10:48 shada.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root  236 mar 26 10:48 spellfile.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root 2527 mar 26 10:48 tarPlugin.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root  442 mar 26 10:48 tohtml.lua&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root  202 mar 26 10:48 tutor.vim&lt;/span&gt;
&lt;span class="n"&gt;-rw-r--r-- 1 root root 2642 mar 26 10:48 zipPlugin.vim&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plugin&lt;/th&gt;
&lt;th&gt;Funcionalidad&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;editorconfig&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Busca y lee archivos .editorconfig para aplicar reglas de indentación, fines de línea  y codificación&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gzip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Editar archivos comprimidos con gzip&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;man&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Abrir páginas del manual en el editor&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;matchit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Extiende la funcionalidad del comando&lt;/em&gt; &lt;code&gt;%&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;matchparen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Resalta paréntesis coincidentes&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;netrwPlugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Maneja la transferencia de archivos y listado de directorios remotos a través de una red&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;osc52&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Detecta si es posible usar el código de escape ANSI para copir desde vim a otras terminales para poder copiar texto desde neovim usand el clipboard del sistema&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rplugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Gestiona, migra, actualiza y carga remote plugins automáticamente (están escritos en otros lenguajes como Python, Ruby, Node.js, etc y que se manejan de manera independiente del editor sin afectar el rendimiento)&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;shada&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Datos Compartidos entre las sesiones de neovim&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;spellfile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Descarga de archivos de ortografía&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tarPlugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Exploración de tarballs&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tohtml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Conversor a html&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tutor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Tutorial&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;zipPlugin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Exploración de archivos zip&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Los scripts en vimL pueden contener comandos de edición, estructuras de control, funciones, manejo de listas, diccionarios, y puede simular objetos mediante diccionarios con referencias a funciones. El otro lenguaje nativo que incorpora neovim es &lt;strong&gt;Lua&lt;/strong&gt;. Los desarrolladores de neovim consideran que ese lenguaje es más eficiente, tiene una sintaxis más moderna y estándar, maneja mejor los errores, permite que sea extendido fácilmente con plugins y módulos complejos, sin necesidad de depender de procesos externos o hacks.&lt;/p&gt;
&lt;p&gt;Si consideramos el archivo del plugin &lt;strong&gt;man&lt;/strong&gt; contiene lo siguiente:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;loaded_man&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;return&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;loaded_man&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nvim_create_user_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Man'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;man&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'man'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;bang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nv"&gt;man&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init_pager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;else&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;man&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;smods&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;fargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'man.lua: '&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;levels&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;bang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;bar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;range&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'other'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;nargs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'*'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;complete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'man'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;man_complete&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;augroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nvim_create_augroup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'nvim.man'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;

&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nvim_create_autocmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'BufReadCmd'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;augroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'man://*'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;nested&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nv"&gt;callback&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'man'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;match&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'man://(.*)'&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kr"&gt;then&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'man.lua: '&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;vim&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;levels&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kr"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="mini-resumen-conceptual-manlua"&gt;📝 Mini resumen conceptual — man.lua&lt;/h3&gt;
&lt;h4 id="que-hace-el-plugin"&gt;✔ ¿Qué hace el plugin?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Define &lt;strong&gt;cómo abrir manpages&lt;/strong&gt; usando comandos (&lt;code&gt;:Man&lt;/code&gt;) y URIs (&lt;code&gt;man://...&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Define &lt;strong&gt;cómo manejar errores&lt;/strong&gt; (usa &lt;code&gt;vim.notify&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="como-funciona"&gt;✔ ¿Cómo funciona?&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Previene carga múltiple&lt;/strong&gt; con &lt;code&gt;vim.g.loaded_man&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crea un comando&lt;/strong&gt; &lt;code&gt;:Man&lt;/code&gt; con opciones (bang, autocompletado, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crea un autocmd&lt;/strong&gt; que detecta buffers con URI &lt;code&gt;man://&lt;/code&gt; y carga la manpage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usa funciones&lt;/strong&gt; (&lt;code&gt;open_page&lt;/code&gt;, &lt;code&gt;init_pager&lt;/code&gt;, &lt;code&gt;read_page&lt;/code&gt;, &lt;code&gt;man_complete&lt;/code&gt;) definidas en el módulo &lt;code&gt;man&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Muestra errores&lt;/strong&gt; con &lt;code&gt;vim.notify&lt;/code&gt; si algo falla.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="que-flujo-sigue"&gt;✔ ¿Qué flujo sigue?&lt;/h4&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;Usuario → :Man o :edit man:// → función del módulo man → buffer con la manpage
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="el-plugin-es-100-todo-lua"&gt;✅ El plugin es 100% todo Lua&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Usa &lt;strong&gt;API moderna&lt;/strong&gt; de Neovim:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim.api.nvim_create_user_command&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim.api.nvim_create_autocmd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim.notify&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Usa &lt;strong&gt;variables globales Lua&lt;/strong&gt;: &lt;code&gt;vim.g.loaded_man&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Usa funciones Lua: &lt;code&gt;string.match&lt;/code&gt;, &lt;code&gt;require&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Es un plugin moderno, pensado para ser usado con Neovim o Vim con soporte de Lua.&lt;/p&gt;
&lt;h3 id="api-para-plugins-y-herramientas"&gt;API para plugins y herramientas&lt;/h3&gt;
&lt;p&gt;Además, neovim posee una API con la cual se pueden hacer desarrollos en otros lenguajes de programación y por eso existen plugins y/o herramientas relacionadas que no están escritos en vimL o LUA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nvim-java/nvim-java"&gt;Painless Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://neovim.io/node-client/"&gt;neovimi (node.js)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neoclide/coc.nvim"&gt;Nodejs extension host for vim &amp;amp; neovim, load extensions like VSCode and host language servers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/neovim/pynvim"&gt;Cliente de python para escribir plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El plugin &lt;strong&gt;&lt;a href="https://github.com/brooth/far.vim"&gt;far.vim&lt;/a&gt;&lt;/strong&gt; está desarrollado en python:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/far-plugin.png"&gt;&lt;img src="https://sergiobelkin.com/images/far-plugin.thumbnail.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Se debe ejecutar &lt;code&gt;:UpdateRemotePlugins&lt;/code&gt; cada vez que un plugin remoto se instale, se actualice, o se borre. Esto generará o actualizará un archivo manifest, por ejemplo:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;cat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;nvim&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;rplugin&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="s"&gt;" node plugins&lt;/span&gt;


&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;python3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;
&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;remote&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;RegisterPlugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;python3&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;nvim&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;plugged&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;far&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vim&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;rplugin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;far&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;sync&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;_far_nvim_rpc_async_invoke&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;function&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;opts&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{}},&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;


&lt;span class="s"&gt;" ruby plugins&lt;/span&gt;


&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="equivalencias-entre-vim-y-neovim"&gt;Equivalencias entre Vim y Neovim&lt;/h3&gt;
&lt;p&gt;Abro un paréntesis para recordar las equivalencias entre archivos de Vim y Neovim:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Elemento&lt;/th&gt;
&lt;th&gt;Vim&lt;/th&gt;
&lt;th&gt;Neovim&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Config principal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vimrc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.config/nvim/init.vim&lt;/code&gt; o &lt;code&gt;init.lua&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Carpeta de configuración&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vim/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.config/nvim/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugins (autoload)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vim/autoload/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.local/share/nvim/site/autoload/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugins (paquetes)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vim/pack/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.local/share/nvim/site/pack/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datos de usuario (swap, undo, backup, etc.)&lt;/td&gt;
&lt;td&gt;Dentro de &lt;code&gt;~/.vim/&lt;/code&gt; o definido por el usuario&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.local/state/nvim/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swap files&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vim/swapfiles/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.local/state/nvim/swap/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Undo files&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vim/undodir/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.local/state/nvim/undo/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup files&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vim/backup/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.local/state/nvim/backup/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;viminfo&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.viminfo&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;No se usa directamente&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;shada&lt;/td&gt;
&lt;td&gt;&lt;em&gt;No aplica (usa viminfo)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.local/share/nvim/shada/main.shada&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Colorschemes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vim/colors/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.config/nvim/colors/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After directory (sobreescribir plugins/config)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.vim/after/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.config/nvim/after/&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Nota sobre &lt;em&gt;shada&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vim usa &lt;code&gt;viminfo&lt;/code&gt; → &lt;code&gt;~/.viminfo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Neovim usa &lt;code&gt;shada&lt;/code&gt; → &lt;code&gt;~/.local/share/nvim/shada/main.shada&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No es recomendable hacer enlace simbólico entre estos dos archivos porque no son 100% compatibles.&lt;/p&gt;
&lt;h3 id="soporte-nativo-para-plugins-en-vim-8-y-en-adelante"&gt;Soporte nativo para plugins en Vim 8 (y en adelante)&lt;/h3&gt;
&lt;!--&lt;a class="image-reference" href="/images/"handy-wicaksono-brizG9kR6qI-unsplash.jpg&gt;&lt;img src="/images/handy-wicaksono-brizG9kR6qI-unsplash.thumbnail.jpg" alt="Paquetes"&gt;&lt;/a&gt;--&gt;

&lt;p&gt;&lt;img alt="Paquetes en Vim" class="img-izquierda-responsiva" src="https://sergiobelkin.com/images/handy-wicaksono-brizG9kR6qI-unsplash.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Photo by &lt;a href="https://unsplash.com/@handywicaksono?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Handy Wicaksono&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/package?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Desde Vim 8.0 el editor cuenta con soporte nativo para paquetes. En Vim un paquete no es otra cosa que un directorio de plugins. Es decir, considerando el siguiente escenario.&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/native-packages.png"&gt;&lt;img src="https://sergiobelkin.com/images/native-packages.thumbnail.png" alt="Estructura de directorios de sistema nativo de plugins"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;El paquete &lt;em&gt;lightline.vim&lt;/em&gt; se va a cargar automáticamente al abrir el editor, mientras que el otro plugin &lt;em&gt;toggleterm&lt;/em&gt; podrá activarse con el comando &lt;code&gt;:packadd toggleterm.nvim&lt;/code&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h4 id="guia-rapida-para-el-metodo-nativo-de-vim-8"&gt;Guía rápida para el método nativo de Vim 8+&lt;/h4&gt;
&lt;p&gt;Mostraré como usar 2 plugins.&lt;/p&gt;
&lt;h5 id="1-crear-las-carpetas-necesarias"&gt;1. Crear las carpetas necesarias&lt;/h5&gt;
&lt;p&gt;Abrí tu terminal y ejecutá:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;-p&lt;span class="w"&gt; &lt;/span&gt;~/.vim/pack/misplugins/&lt;span class="o"&gt;{&lt;/span&gt;start,opt&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Explicación rápida:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.vim/pack/&lt;/code&gt; → carpeta donde Vim busca paquetes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;misplugins&lt;/code&gt; → nombre del grupo que quieras (puede ser cualquier nombre).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start/&lt;/code&gt; → indica que los plugins se &lt;strong&gt;cargan automáticamente&lt;/strong&gt; al abrir Vim.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;opt/&lt;/code&gt;   → indica que los plugins se cargarán bajo demanda con el comando &lt;code&gt;packadd&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h5 id="2-descargar-los-plugins"&gt;2. Descargar los plugins&lt;/h5&gt;
&lt;p&gt;Ahora dentro de &lt;code&gt;start/&lt;/code&gt;, cloná los repositorios de Git de los plugins:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.vim/pack/misplugins/opt

&lt;span class="c1"&gt;# vim-fugitive (permite ejecutar y gestionar comandos de Git directamente dentro de Vim, como hacer commits, ver logs, ver diferencias (diffs) y manejar ramas sin salir del editor.)&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://tpope.io/vim/fugitive.git
vim&lt;span class="w"&gt; &lt;/span&gt;-u&lt;span class="w"&gt; &lt;/span&gt;NONE&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"helptags fugitive/doc"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-c&lt;span class="w"&gt; &lt;/span&gt;q

&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.vim/pack/misplugins/start

&lt;span class="c1"&gt;# lightline.vim (barra de estado mejorada)&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/itchyny/lightline.vim.git
&lt;span class="c1"&gt;# Usar el comando siguiente si lightline.vim se muestre sin colores y guardarlo en algún archivo de configuración del shell.&lt;/span&gt;
&lt;span class="c1"&gt;# export TERM=xterm-256color &lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Con esto ya los tenés instalados.&lt;/p&gt;
&lt;hr&gt;
&lt;h5 id="3-configuracion-para-lightlinevim"&gt;3. Configuración para lightline.vim|&lt;/h5&gt;
&lt;p&gt;&lt;strong&gt;Podés agregar algunas líneas en tu &lt;code&gt;~/.vimrc&lt;/code&gt; para aprovechar lightline.vim:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="c"&gt;" Opcional: configuración mínima para lightline&lt;/span&gt;
&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;laststatus&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h5 id="4-listo"&gt;4. Listo&lt;/h5&gt;
&lt;p&gt;¡Abrí Vim y ya podés usar el plugin lightline.vim! &lt;/p&gt;
&lt;p&gt;Si querés cargar el plugin fugitive, lo hacés con:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="p"&gt;:&lt;/span&gt;packadd fugitive
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Importante: Los plugins escritos en lua no funcionarán en Vim&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Algo interesante en Vim y Neovim es que podemos ver los plugins que ya vienen con el editor con el comando &lt;code&gt;:help standard-plugin-list&lt;/code&gt; y con &lt;code&gt;:help local-additions&lt;/code&gt; los plugins que vamos agregando:&lt;/p&gt;
&lt;p&gt;&lt;a class="image-reference" href="https://sergiobelkin.com/images/plugin-lists.gif"&gt;&lt;img src="https://sergiobelkin.com/images/plugin-lists.thumbnail.gif" alt=""&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;O si preferimos algo más sofisticado, para ver nuestros plugins:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;:echo join(keys(g:plugs), ' ')&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Si bien esta funcionalidad también existe en Neovim,  podemos administrar los plugins de manera más flexible y automatizada. Esto nos lleva a considerar el uso de gestores de plugins.&lt;/p&gt;
&lt;h3 id="gestores-de-plugins"&gt;Gestores de plugins&lt;/h3&gt;
&lt;p&gt;Existen varios gestores de plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shougo/dein.vim"&gt;Shougo/dein.vim: Dark powered Vim/Neovim plugin manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/VundleVim/Vundle.vim"&gt;VundleVim/Vundle.vim: Vundle, the plug-in manager for Vim&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/junegunn/vim-plug"&gt;junegunn/vim-plug: Minimalist Vim Plugin Manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Me parece muy recomendable &lt;strong&gt;vim-plug&lt;/strong&gt; porque:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requiere muy poca configuración: una lista con los paquetes de plugins deseados.&lt;/li&gt;
&lt;li&gt;Instala y actualiza todos los paquetes de nuestra lista o los que seleccionemos.&lt;/li&gt;
&lt;li&gt;Detecta y elimina plugins que borramos de nuestra lista. &lt;/li&gt;
&lt;li&gt;Muestra el estado de los plugins.&lt;/li&gt;
&lt;li&gt;Genera instantáneas de nuestros paquetes con su configuración, con la posibilidad de restaurarlas.&lt;/li&gt;
&lt;li&gt;Posee atajos de teclado.&lt;/li&gt;
&lt;li&gt;Es compatible tanto con Vim como Neovim&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si queremos deshabilitar todos los plugins podemos ejecutar &lt;code&gt;nvim --noplugin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Neovim sigue los lineamientos de la XDG Base Directory Specification. &lt;strong&gt;Algo que puede ser muy útil&lt;/strong&gt;: poner el listado de plugins en un archivo separado. Esto es: creando un archivo &lt;code&gt;${XDG_CONFIG_HOME:-$HOME/.config}/nvim/plugins.vim&lt;/code&gt; y en el archivo &lt;code&gt;${XDG_CONFIG_HOME:-$HOME/.config}/nvim/init.vim&lt;/code&gt; teniendo una simple línea:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;runtime plugins.vim&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Entonces, comentando esa línea es una manera alternativa para desactivarlos.&lt;/p&gt;
&lt;p&gt;Pero hay más: supongamos que tenemos esta configuración en el archivo &lt;code&gt;${XDG_CONFIG_HOME:-$HOME/.config}/nvim/plugins.vim&lt;/code&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="nx"&gt;Plug&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="nx"&gt;nyngwang&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;NeoTerm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lua&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;plug&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="s"&gt;" Esta es la manera de embeber código lua en un archivo de tipo vimL&lt;/span&gt;
&lt;span class="s"&gt;lua &amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;require("&lt;/span&gt;&lt;span class="nx"&gt;neo&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;term&lt;/span&gt;&lt;span class="s"&gt;").setup {&lt;/span&gt;
&lt;span class="s"&gt;  exclude_filetypes = { "&lt;/span&gt;&lt;span class="nx"&gt;oil&lt;/span&gt;&lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;EOF&lt;/span&gt;

&lt;span class="nx"&gt;nnoremap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;F4&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;NeoTermToggle&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CR&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nx"&gt;tnoremap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;F4&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;:&lt;/span&gt;&lt;span class="nx"&gt;NeoTermToggle&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CR&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nx"&gt;tnoremap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Esc&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;:&lt;/span&gt;&lt;span class="nx"&gt;NeoTermEnterNormal&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CR&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Con esta configuración:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Al presionar &lt;strong&gt;F4&lt;/strong&gt; se abirá una terminal.&lt;/li&gt;
&lt;li&gt;Al presionar de vuelta &lt;strong&gt;F4&lt;/strong&gt; se cerrará la terminal.&lt;/li&gt;
&lt;li&gt;Con &lt;strong&gt;Esc&lt;/strong&gt; se vuelve al modo &lt;em&gt;Normal&lt;/em&gt; en la terminal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En tiempos en los que tanto se declama la agilidad, como contrasentido se ofrecen editores que consumen muchos recursos, con desarrollos no exentos de torpezas y caprichos impuestos de antemano. El minimalismo de Vim como de Neovim nos permite adaptarlo de acuerdo a lo que necesitemos, la posibilidad de agregar distintas funcionalidades, sea para desarrollo, mejor usabilidad y experiencia del usuario (sí: el desarrollador o sysadmin también es un usuario 😀).
Finalmente, si bien tanto Vim como Neovim poseen el soporte nativo para manejar paquetes de plugins, encuentro en vim-plugin una manera mucho más conveniente de hacerlo.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Carga de Plugins en Vim" class="img-izquierda-responsiva" src="https://sergiobelkin.com/images/CargaPlugins.png"&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;Característica&lt;/th&gt;
&lt;th style="text-align: left;"&gt;Sistema Nativo (Vim 8 &lt;code&gt;packages&lt;/code&gt;)&lt;/th&gt;
&lt;th style="text-align: left;"&gt;&lt;code&gt;vim-plug&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Instalación&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Manual (clonar repos en &lt;code&gt;pack/&lt;/code&gt;)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Automática vía script (&lt;code&gt;plug.vim&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Configuración&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;En &lt;code&gt;vimrc&lt;/code&gt;, usando &lt;code&gt;packadd&lt;/code&gt; o estructura &lt;code&gt;start/opt&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Declarativa en &lt;code&gt;vimrc&lt;/code&gt; con &lt;code&gt;Plug&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Carga diferida (lazy-loading)&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Manual con &lt;code&gt;packadd&lt;/code&gt; desde &lt;code&gt;opt/&lt;/code&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Incorporado: &lt;code&gt;on&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt;, &lt;code&gt;cmd&lt;/code&gt;, &lt;code&gt;event&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Instalación de plugins&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Manual (&lt;code&gt;git clone&lt;/code&gt;)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;:PlugInstall&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Actualización&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Manual (&lt;code&gt;git pull&lt;/code&gt; en cada plugin)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;:PlugUpdate&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Desinstalación&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Manual (borrar carpeta)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;&lt;code&gt;:PlugClean&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Gestión de dependencias&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;No soportado nativamente&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Limitada (tú defines el orden)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Soporte para branches/tags&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Manual (&lt;code&gt;git checkout&lt;/code&gt;)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Sí (&lt;code&gt;Plug 'user/repo', { 'branch': 'dev' }&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Paralelismo en instalación&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;No&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Sí (instala varios plugins a la vez)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Interfaz de usuario&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Ninguna&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Básica pero útil (durante instalación/update)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Velocidad en carga&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Muy rápida (carga solo en startup)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Muy rápida con lazy loading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Soporte oficial&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Parte de Vim 8+&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Mantenido por la comunidad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Curva de aprendizaje&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Mayor (entender estructura &lt;code&gt;pack/&lt;/code&gt;)&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Muy simple y bien documentado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;&lt;strong&gt;Compatibilidad&lt;/strong&gt;&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Solo Vim 8+&lt;/td&gt;
&lt;td style="text-align: left;"&gt;Compatible con Vim 7.4+, Neovim&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="conclusion"&gt;Conclusión&lt;/h3&gt;
&lt;p&gt;&lt;img alt="Metáfora de las bibliotecas" class="img-izquierda-responsiva" src="https://sergiobelkin.com/images/metafora-de-la-bibliotecas.webp"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;El soporte nativo de Vim/Neovim es como una biblioteca física organizada con dos tipos de estantes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;start/&lt;/code&gt;&lt;/strong&gt;: son los libros que se abren automáticamente apenas entrás a la biblioteca —es decir, los plugins que se cargan al iniciar Vim/Neovim.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;opt/&lt;/code&gt;&lt;/strong&gt;: son libros que están en los estantes, pero que &lt;strong&gt;vos tenés que buscar y abrir manualmente&lt;/strong&gt; usando el comando &lt;code&gt;:packadd&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Este sistema te da control total, pero también requiere que te ocupes de la instalación, organización y carga de cada plugin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los gestores de plugins, como &lt;code&gt;vim-plug&lt;/code&gt;, funcionan como un sistema de préstamo digital moderno:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Suscripción básica:&lt;/strong&gt;
   Declarás qué libros (plugins) querés en una lista de solicitudes (&lt;code&gt;Plug 'autor/plugin'&lt;/code&gt;), y al ejecutar un comando como &lt;code&gt;PlugInstall&lt;/code&gt;, el sistema los descarga automáticamente y los organiza en las secciones correspondientes del runtimepath.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dependencias = citas bibliográficas que debés declarar manualmente:&lt;/strong&gt;
   Si el libro A necesita al libro B para entenderse correctamente, &lt;strong&gt;vos tenés que pedir ambos explícitamente&lt;/strong&gt;.
   A diferencia de gestores como &lt;code&gt;npm&lt;/code&gt;, &lt;code&gt;pip&lt;/code&gt; o &lt;code&gt;cargo&lt;/code&gt;, &lt;strong&gt;no hay resolución automática de dependencias&lt;/strong&gt;: nadie deduce relaciones por vos.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Actualizaciones periódicas:&lt;/strong&gt;
   Usando el comando &lt;code&gt;PlugUpdate&lt;/code&gt;, podés sincronizar tu colección con las últimas ediciones disponibles.
   Eso sí: estos comandos actualizan lo que ya tenés, &lt;strong&gt;pero no agregan automáticamente nuevos plugins a menos que los declares en tu configuración.&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ahora cabe preguntarse dos cosas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;¿Cómo podemos empezar a usar &lt;strong&gt;Lua&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Más allá de que &lt;code&gt;vim-plug&lt;/code&gt; es una excelente opción: ¿Es actualmente la mejor para &lt;strong&gt;Neovim&lt;/strong&gt;?&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="mas-recursos"&gt;Más Recursos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://neovim.io/doc/user/develop.html"&gt;Nvim documentation: develop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://specifications.freedesktop.org/basedir-spec/latest/ar01s03.html"&gt;Variables de Entorno de XDG Base Directory Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/brooth/far.vim"&gt;brooth/far.vim: Find And Replace Vim plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://vimawesome.com/"&gt;Vim Awesome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opensource.com/article/20/2/how-install-vim-plugins"&gt;How to install Vim plugins | Opensource.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shapeshed.com/vim-packages/#vim-8-brings-native-third-party-package-loading"&gt;Vim: So long Pathogen, hello native package loading | George Ornbo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/una-introduccion-pragmatica-al-uso-de-plugins-en-neovim/</guid><pubDate>Sun, 04 May 2025 19:22:12 GMT</pubDate></item><item><title>Cómo pegar texto en VIM usando Ctrl-v</title><link>https://sergiobelkin.com/posts/como-pegar-texto-copiado-de-otro-programa-en-vim/</link><dc:creator>sebelk</dc:creator><description>&lt;figure&gt;&lt;img src="https://sergiobelkin.com/images/undraw_code_review_l1q9.png"&gt;&lt;/figure&gt; &lt;p&gt;Cuando copiamos un texto desde otro programa y lo queremos pegar en VIM, no podemos usar el atajo de teclado Ctrl-v. Sin embargo, podemos usar la siguiente configuración para poder hacerlo&lt;/p&gt;
&lt;p&gt;&lt;code&gt;imap &amp;lt;C-v&amp;gt; &amp;lt;C-o&amp;gt;"+p&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Dicha configuración hay que guardarlo en el archivo &lt;code&gt;~/vimrc&lt;/code&gt; (en el caso de neovim usar &lt;code&gt;~/.config/nvim/init.vim&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¡Eso es todo!&lt;/strong&gt;&lt;/p&gt;</description><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/como-pegar-texto-copiado-de-otro-programa-en-vim/</guid><pubDate>Wed, 25 Dec 2019 23:03:22 GMT</pubDate></item><item><title>VIM + Markdown = Sorprendente</title><link>https://sergiobelkin.com/posts/vim-%2B-markdown-sorprendente/</link><dc:creator>sebelk</dc:creator><description>&lt;h3 id="que-es"&gt;¿Qué es?&lt;/h3&gt;
&lt;p&gt;En artículos anteriores ya habíamos hablado acerca de Markdown. VNote es una aplicación para tomar notas, diseñado especialmente para Markdown. Pero no es otro editor más. No posee doble panel como &lt;em&gt;ReText&lt;/em&gt; o &lt;em&gt;Haroopad&lt;/em&gt;. Tampoco es &lt;em&gt;WYSIWYG&lt;/em&gt; como &lt;em&gt;Typora&lt;/em&gt; o &lt;em&gt;Mark Text&lt;/em&gt;.  El problema con el primer enfoque es que contar con dos paneles no favorece a la concentración. La segunda táctica contradice en cierta manera el espíritu de markdown que es la capacidad de tener control sobre lo que se está escribiendo.&lt;/p&gt;
&lt;p&gt;El intento de VNote por acortar la distancia entre escritura y lectura que ofrece Markdown es muy ingenioso. Recuerda al WYSIWYM del editor LyX. Claro, la diferencia es que markdown es por lejos, mucho más amigable que LaTeX.&lt;/p&gt;
&lt;p&gt;VNote usa libretas, carpetas y notas para la jerarquía de las notas para administrar las notas. Este principio de una 1 nota, 1 archivo favorece la gestión por parte del usuario. Algo que no ocurre con otros intentos como &lt;strong&gt;MindForger&lt;/strong&gt;, por citar un ejemplo.&lt;/p&gt;
&lt;h3 id="ficha"&gt;Ficha&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;VNote&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Author: Le Tan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Licencia: MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sitio Web: &lt;a href="https://tamlok.github.io/vnote/"&gt;tamlok.github.io/vnote&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="para-que-sirve"&gt;¿Para qué sirve?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Para escribir notas y organizarlas&lt;/li&gt;
&lt;li&gt;Los siguientes usos no fueron parte  principal del propósito que tuvo en mente el desarrollador, no obstante, se puede adaptar bastante bien para:*&lt;ul&gt;
&lt;li&gt;Para escribir artículos técnicos&lt;/li&gt;
&lt;li&gt;Para escribir posts para un blog&lt;/li&gt;
&lt;li&gt;Para escribir documentación&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="reference" href="https://sergiobelkin.com/images/ventanadev_1537790445_1902964195.png" alt="Ventana de Vnote"&gt;&lt;img src="https://sergiobelkin.com/images/ventanadev_1537790445_1902964195.thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="funcionalidades"&gt;Funcionalidades&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Facilita el ingreso de textos frecuente (&lt;strong&gt;Snippets&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Expansión de palabras permite el ingreso de la fecha actual, nombres y otros textos de manera rápida (&lt;strong&gt;Word Magic&lt;/strong&gt;). Viene con una lista predeterminada, pero se pueden agregar más a la misma&lt;/li&gt;
&lt;li&gt;Plantillas&lt;/li&gt;
&lt;li&gt;Temas y estilos&lt;/li&gt;
&lt;li&gt;Guarda sesiones, es decir permite seguir trabajando con los mismos archivos que teníamos abierto en la sesión anterior&lt;/li&gt;
&lt;li&gt;Exportación: Markdown con sus imágenes y adjuntos en una carpeta para distribuir, motor interno para convertir a pdf. También soporta la conversión usando wkhtmltopdf u otro comando personalizado.&lt;/li&gt;
&lt;li&gt;Potente motor de búsqueda, que permite buscar entre una o más notas e incluso por tags de las mismas.&lt;/li&gt;
&lt;li&gt;MathJax  para interpretar ecuaciones matemáticas
$$ a^2 + b^2 = c^2 $$&lt;/li&gt;
&lt;li&gt;Diagramas  mediante Mermaid o Flowchart&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TD&lt;/span&gt;
&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VNote&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Qué&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;es&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Para&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qué&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;se&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;usa&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Funcionalidades&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Como&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;instalarlo&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Conclusión&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;a class="reference" href="https://sergiobelkin.com/images/1539005194_597894539.png" alt="Gráficos Mermaid en VNote"&gt;&lt;img src="https://sergiobelkin.com/images/1539005194_597894539.thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Soporte para emojis&lt;blockquote&gt;
&lt;p&gt;**Por favor no vote a un :cat: ** &lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="emojis" src="https://sergiobelkin.com/images/Screenshot_20181208_182230.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pestañas&lt;/li&gt;
&lt;li&gt;Modo vim&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="conclusiones"&gt;Conclusiones&lt;/h3&gt;
&lt;p&gt;Me gusta que tenga un modo lectura y un modo edición, en lugar de código puro y panel para previsualizar, el modo &lt;strong&gt;Vim&lt;/strong&gt; es sorprendente y para mis preferencias y necesidades lo convierte en un claro ganador frente a otras alternativas. Asimismo, la impresión que genera VNote es la de un proyecto que se ha interesado en detalles que a veces se pasan por alto en proyectos Open Source.&lt;/p&gt;
&lt;h3 id="buscando-mas"&gt;¿Buscando Más?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://sergiobelkin.com/posts/mark-text-markdown-en-tiempo-real.html"&gt;Mark Text: Markdown en tiempo real | SEBELK FOSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.sergiobelkin.com/posts/2017/10/01/typora-el-mejor-editor-markdown.html"&gt;Typora, el mejor editor markdown | SEBELK FOSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mindforger.com/"&gt;MindForger - Thinking Notebook and Markdown IDE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/retext-project/retext"&gt;retext-project/retext: ReText: Simple but powerful editor for Markdown and reStructuredText&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://pad.haroopress.com/user.html"&gt;Haroopad - The Next Document processor based on Markdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lyx.org/"&gt;LyX | LyX – The Document Processor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>markdown</category><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/vim-%2B-markdown-sorprendente/</guid><pubDate>Sat, 08 Dec 2018 20:24:44 GMT</pubDate></item><item><title>Lo viejo, lo bueno y lo nuevo en Neovim</title><link>https://sergiobelkin.com/posts/2017/11/20/lo-viejo-lo-bueno-y-lo-nuevo-en-neovim/</link><dc:creator>sebelk</dc:creator><description>&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post-new.php"&gt;
&lt;div style="height: 0; width: 0; max-height: 0; max-width: 0; overflow: hidden; font-size: 0em; padding: 0; margin: 0;" title="MDH:PHA+IyBOZW92aW08L3A+PHA+IyMgQ2FyYWN0ZXLDrXN0aWNhczwvcD48cD5FbCBlZGl0b3IgKipO ZW92aW0qKiBzZSBwcmVzZW50YSBjb21vIGVsIHN1Y2Vzb3IgZGVsIGVkaXRvciBWaW0uPC9wPjxw Pi0gKkVsIGNvbmVjdG9yIGVudHJlIGNvbXBvbmVudGVzIGRlIHNvZnR3YXJlLCBNZXNzYWdlUGFj ayBkZSBtYW5lcmEgZWZpY2llbnRlIGRhdG9zIGVuIGJpbmFyaW8geSBzaXJ2ZSBwYXJhIGludGVy Y2FtYmlhcmxvcyBlbiBsZW5ndWFqZXMgdGFsZXMgY29tbyBKU09OLio8L3A+PHA+LSAqTG9zIHBs dWdpbnMgcmVtb3RvcyBzb24gY29wcm9jZXNvcyBxdWUgdGllbmVuIHVuIGNhbmFsIGRlIGNvbXVu aWNhY2nDs24gcG9yIG1lZGlvIGRlIFJQQyBjb24gZWwgcHJvY2VzbyBkZSBuZW92aW0uIEVzdG9z IHBsdWdpbnMgYWRlbcOhcyBzZSBlamVjdXRhbiBkZSBtYW5lcmEgYXPDrW5jcm9uYSwgbWVqb3Jh bmRvIGFzw60gZWwgcmVuZGltaWVudG8uKjwvcD48cD4tIFVuYSBjb25maWd1cmFjacOzbiBwcmVk ZXRlcm1pbmFkYSBtw6FzIHBvdGVudGUgeSBhbWlnYWJsZS48L3A+PHA+IyMgTGEgY29uZmlndXJh Y2nDs24gcHJlZGV0ZXJtaW5hZGEgaW5jbHV5ZTwvcD48cD4tIEN1YW5kbyBzZSBkZXRlY3RhIHF1 ZSB1biBhcmNoaXZvIGhhIHNpZG8gY2FtYmlhZG8gZGVudHJvIGRlIFZpbSwgYXV0b23DoXRpY2Ft ZW50ZSBsbyBsZWUgZGUgdnVlbHRhLjxicj4tIFBlcm1pdGUgYm9ycmFyIHBvciB1bmEgYXV0b2lu ZGVudGFjacOzbiwgcG9yIHNhbHRvcyBkZSBsw61uZWEgeSBhbCBjb21pZW56byBkZSBpbnNlcmNp w7NuLjxicj4tIEFob3JhIGxvcyBkaXJlY3RvcmlvcyBkZSBiYWNrdXAgZXN0w6FuIGVuIH4vLmxv Y2FsL3NoYXJlL252aW0vYmFja3VwIHNpZ3VpZW5kbyBsYXMgZGlyZWN0cmljZXMgeGRnIFsmbHQ7 c3VwJmd0O14xJmx0Oy9zdXAmZ3Q7XTxicj4tIFJlc2FsdGEgbG9zIHJlc3VsdGFkb3MgY29pbmNp ZGVudGVzIGRlIGLDunNxdWVkYXM8YnI+LSBSZWFsaXphIGLDunNxdWVkYXMgaW5jcmVtZW50YWxl czxicj4tIE11ZXN0cmEgc2llbXByZSBsYSBsw61uZWEgZGUgZXN0YWRvPGJyPi0gQWhvcmEgc2Ug cHVlZGVuIHZlciBtZWpvciBsYXMgdGFidWxhY2lvbmVzIHkgZXNwYWNpb3MgYWwgZmluYWwgZGUg Y2FkYSBsw61uZWE8YnI+LSBNdWVzdHIgZWwgY29tYW5kbyBxdWUgc2UgZXN0w6EgZWplY3V0YW5k bzxicj4tIE1hbmVqbyBtw6FzIGludGVsaWdlbnRlIGRlIHRhYnVsYWNpb25lczxicj4tIEFzdW1l IHVuYSB0ZXJtaW5hbCBkZSBjb25leGnDs24gcsOhcGlkYTxicj4tIExhIGNhbXBhbmlsbGEgZXN0 w6EgZGVzaGFiaWxpdGFkYSBwYXJhIHRvZG9zIGxvcyBldmVudG9zPGJyPi0gRWwgZGlyZWN0b3Jp byBwYXJhIHRlbXBvcmFsZXMgZXN0w6EgZW4gfi8ubG9jYWwvc2hhcmUvbnZpbS9zd2FwIFsmbHQ7 c3VwJmd0O14xJmx0Oy9zdXAmZ3Q7XS48YnI+LSBFbCBjb21hbmRvIGBkaXNwbGF5YCBtdWVzdHJh IGxhIMO6bHRpbWEgbMOtbmVhIGRlIGxvcyByZWdpc3Ryb3MuPGJyPi0gSnVzdGlmaWNhIGF1dG9t w6F0aWNhbWVudGUgdXNhbmRvIGVsIGFuY2hvIGRlbCB0ZXh0bywgaW5zZXJjacOzbiB5IGJvcnJh ZG8gaW50ZWxpZ2VudGUgZGUgY2FyYWN0ZXJlcyBkZSBjb21lbnRhcmlvcy48L3A+PHA+IyMgQ29u ZmlndXJhY2nDs248L3A+PHA+LSBFbiBgJEhPTUVgIGNyZWFtb3MgdW4gZW5sYWNlOjwvcD48cD5g bHJ3eHJ3eHJ3eCAxIHNlcmdpbyBzZXJnaW8gMTkgbm92IDUgMjM6MzAgaW5pdC52aW0gLSZndDsg L2hvbWUvc2VyZ2lvLy52aW1yY2A8L3A+PHA+LSBZIHRhbWJpw6luIGVuIGAkSE9NRS8uY29uZmln YDo8L3A+PHA+YGxyd3hyd3hyd3ggMSBzZXJnaW8gc2VyZ2lvIDE3IG5vdiA1IDIzOjMwIG52aW0g LSZndDsgL2hvbWUvc2VyZ2lvLy52aW1gPC9wPjxwPi0gRW4gJEhPTUUvLnZpbXJjPC9wPjxwPmBg YGA8YnI+aWYgaGFzKCdudmltJykgPGJyPiBQbHVnICdTaG91Z28vZGVvcGxldGUubnZpbScsIHsg J2RvJzogJzpVcGRhdGVSZW1vdGVQbHVnaW5zJyB9IDxicj4gUGx1ZyAndmltLWFpcmxpbmUvdmlt LWFpcmxpbmUnIDxicj5lbHNlIDxicj4gUGx1ZyAnU2hvdWdvL2Rlb3BsZXRlLm52aW0nIDxicj4g UGx1ZyAncm94bWEvbnZpbS15YXJwJyA8YnI+IFBsdWcgJ3JveG1hL3ZpbS1odWctbmVvdmltLXJw YycgPGJyPiBweXRob24zIGZyb20gcG93ZXJsaW5lLnZpbSBpbXBvcnQgc2V0dXAgYXMgcG93ZXJs aW5lX3NldHVwIDxicj4gcHl0aG9uMyBwb3dlcmxpbmVfc2V0dXAoKSA8YnI+IHB5dGhvbjMgZGVs IHBvd2VybGluZV9zZXR1cCA8YnI+IHNldCBsYXN0c3RhdHVzPTIgPGJyPiBzZXQgdF9Dbz0yNTYg PGJyPmVuZGlmIDxicj4gPGJyPmxldCBnOmRlb3BsZXRlI2VuYWJsZV9hdF9zdGFydHVwID0gMSA8 YnI+IDxicj5uZW90ZXJtIDxicj5QbHVnICdrYXNzaW8vbmVvdGVybScgPGJyPiA8YnI+ImNhbGwg dnVuZGxlI2VuZCgpICIgcmVxdWlyZWQgPGJyPmNhbGwgcGx1ZyNlbmQoKSA8YnI+YGBgYDwvcD48 cD4jIyBOdWV2YXMgZnVuY2lvbmFsaWRhZGVzIHByb3ZlbmllbnRlcyBkZSBwbHVnaW5zPC9wPjxw PkFsZ3Vub3MgZGUgZXN0b3MgcGx1Z2lucyBzb246PC9wPjxwPi0gZmFyLnZpbTogQnVzY2FyIHkg cmVtcGxhemFyLCBhYnJlIHVuIHBhbmVsIGRlIHZpc3RhIHByZXZpYS48YnI+LSBkZW9wbGV0ZS5u dmltOiBBdXRvY29tcGxldGFyLjxicj4tIGZsb29iaXRzOiBFdGhlcnBhZCB1c2FuZG8gbmVvdmlt Ljxicj4tIG5lb3Rlcm06IFRlcm1pbmFsIGVtYmViaWRhLjxicj4hW25lb3Rlcm1dKG5lb3Rlcm0u cG5nKTxicj4tIHZpbS1wYW5kb2M6IEludGVncmFjacOzbiBjb24gZWwgY29udmVyc29yIGRlIGxl bmd1YWplcyBkZSBtYXJjYXMgbGlnZXJvcyAqcGFuZG9jKi48L3A+PHA+IyMgQ29uY2x1c2nDs248 L3A+PHA+RWwgZWRpdG9yICpWSU0qIGVzIHVuYSBleHRyYW9yZGluYXJpYSBoZXJyYW1pZW50YSwg bm8gb2JzdGFudGUgYWRvbGVjZSBkZSBkaXNwYXJpZGFkIGVuIHN1cyBjb25maWd1cmFjaW9uZXMg cHJlZGV0ZXJtaW5hZGFzLCBhbGd1bm9zIGluY29udmVuaWVudGVzIGRlIHJlbmRpbWllbnRvIGUg aW50ZWdyYWNpw7NuIGNvbiBvdHJvcyBzb2Z0d2FyZS4gTmVvdmltIHZpZW5lIGEgcmVzcG9uZGVy IGEgZXN0b3MgaW5jb252ZW5pZW50ZXMgeSBwb3IgYWhvcmEgbG8gZXN0w6EgaGFjaWVuZG8gbXV5 IGJpZW4uIERlIGhlY2hvLCAqKlZJTSoqIGluY29ycG9yw7MgbXVjaGFzIG1lam9yYXMgcHJvdmVu aWVudGVzIGRlICoqTmVvdmltKiouIEVsIHRpZW1wbyBkaXLDoSBzaSBsb3MgcHJveWVjdG9zIHNl IHRlcm1pbmFuIGZ1c2lvbmFuZG8uIExvIGltcG9ydGFudGUgZXMgcXVlIHRlbmVtb3MgdW5hIGFs dGVybmF0aXZhIG1vZGVybmEgYWwgY2FzaSB0cmVpbnRhw7Flcm8gVklNLjwvcD48cD4jIyBOb3Rh czwvcD48cD5bICZsdDtzdWImZ3Q7XjEmbHQ7L3N1YiZndDsgXTogW0ZyZWVkZXNrdG9wLm9yZ10o aHR0cHM6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3dpa2kvKTwvcD4="&gt;&lt;/div&gt;
&lt;article id="markdown-preview" class="markdown-body" data-websocket-port="38543"&gt;
&lt;h2 id="caracteristicas"&gt;Características&lt;/h2&gt;
&lt;p&gt;El editor &lt;strong&gt;Neovim&lt;/strong&gt; se presenta como el sucesor del editor Vim.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;El conector entre componentes de software, MessagePack de manera eficiente intercambia datos en binario y sirve para intercambiarlos en lenguajes tales como JSON.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Los plugins remotos son coprocesos que tienen un canal de comunicación por medio de RPC con el proceso de neovim. Estos plugins además se ejecutan de manera asíncrona, mejorando así el rendimiento.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Una configuración predeterminada más potente y amigable.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="la-configuracion-predeterminada-incluye"&gt;La configuración predeterminada incluye las siguientes funcionalidades:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Cuando se detecta que un archivo ha sido cambiado dentro de Vim, automáticamente lo lee de vuelta.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Permite borrar una autoindentación,  saltos de línea y al comienzo de inserción.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Ahora los directorios de backup están en ~/.local/share/nvim/backup siguiendo las directrices xdg [&lt;sup&gt;^1&lt;/sup&gt;]&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Resalta los resultados coincidentes de búsquedas&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Realiza búsquedas incrementales&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Muestra siempre la línea de estado&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Ahora se pueden ver mejor las tabulaciones y espacios al final de cada línea&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Muestr el comando que se está ejecutando&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Manejo más inteligente de tabulaciones&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Asume una terminal de conexión rápida&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;La campanilla está deshabilitada para todos los eventos&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;El directorio para temporales está en ~/.local/share/nvim/swap [&lt;sup&gt;^1&lt;/sup&gt;].&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;El comando &lt;code&gt;display&lt;/code&gt; muestra la última línea de los registros.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: #008080;"&gt;Justifica automáticamente usando el ancho del texto, inserción y borrado inteligente de caracteres de comentarios.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configuracion"&gt;Configuración&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;En &lt;code&gt;$HOME&lt;/code&gt; creamos un enlace:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;lrwxrwxrwx  1 sergio sergio   19 nov  5 23:30 init.vim -&amp;gt; /home/sergio/.vimrc&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Y también en &lt;code&gt;$HOME/.config&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;lrwxrwxrwx 1 sergio sergio 17 nov  5 23:30 nvim -&amp;gt; /home/sergio/.vim&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En $HOME/.vimrc&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class="hljs ocaml"&gt;&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; has(&lt;span class="hljs-symbol"&gt;‘nvim’&lt;/span&gt;) 
  &lt;span class="hljs-type"&gt;Plug&lt;/span&gt; &lt;span class="hljs-symbol"&gt;‘Shougo&lt;/span&gt;/deoplete.nvim’, { &lt;span class="hljs-symbol"&gt;‘do’&lt;/span&gt;: &lt;span class="hljs-char"&gt;‘:UpdateRemotePlugins’&lt;/span&gt; } 
  &lt;span class="hljs-type"&gt;Plug&lt;/span&gt; &lt;span class="hljs-symbol"&gt;‘vim&lt;/span&gt;-airline/vim-airline’ 
&lt;span class="hljs-keyword"&gt;else&lt;/span&gt; 
  &lt;span class="hljs-type"&gt;Plug&lt;/span&gt; &lt;span class="hljs-symbol"&gt;‘Shougo&lt;/span&gt;/deoplete.nvim’ 
  &lt;span class="hljs-type"&gt;Plug&lt;/span&gt; &lt;span class="hljs-symbol"&gt;‘roxma&lt;/span&gt;/nvim-yarp’ 
  &lt;span class="hljs-type"&gt;Plug&lt;/span&gt; &lt;span class="hljs-symbol"&gt;‘roxma&lt;/span&gt;/vim-hug-neovim-rpc’ 
  python3 from powerline.vim import setup &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; powerline_setup 
  python3 powerline_setup&lt;span class="hljs-literal"&gt;()&lt;/span&gt; 
  python3 del powerline_setup 
  set laststatus=&lt;span class="hljs-number"&gt;2&lt;/span&gt; 
  set t_Co=&lt;span class="hljs-number"&gt;256&lt;/span&gt; 
endif 
 
&lt;span class="hljs-keyword"&gt;let&lt;/span&gt; g:deoplete#enable_at_startup = &lt;span class="hljs-number"&gt;1&lt;/span&gt; 
 
neoterm 
&lt;span class="hljs-type"&gt;Plug&lt;/span&gt; &lt;span class="hljs-symbol"&gt;‘kassio&lt;/span&gt;/neoterm’ 
 
&lt;span class="hljs-string"&gt;“call vundle#end()            “&lt;/span&gt; required 
call plug#&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;&lt;span class="hljs-literal"&gt;()&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="nuevas-funcionalidades-provenientes-de-plugins"&gt;Nuevas funcionalidades provenientes de plugins&lt;/h2&gt;
&lt;p&gt;Algunos de estos plugins son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;far.vim: Buscar y remplazar, abre un panel de vista previa.&lt;/li&gt;
&lt;li&gt;deoplete.nvim: Autocompletar.&lt;/li&gt;
&lt;li&gt;floobits: Etherpad usando neovim.&lt;/li&gt;
&lt;li&gt;neoterm: Terminal embebida.&lt;br&gt;
&lt;a href="https://sergiobelkin.com/wp-content/uploads/2017/11/Screenshot_20171217_203358.png"&gt;&lt;img class="size-large wp-image-884 alignleft" src="https://sergiobelkin.com/wp-content/uploads/2017/11/Screenshot_20171217_203358-1024x544.png" alt="neoterm" width="640" height="340"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;vim-pandoc: Integración con el conversor de lenguajes de marcas ligeros &lt;em&gt;pandoc&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusión&lt;/h2&gt;
&lt;p&gt;El editor &lt;em&gt;VIM&lt;/em&gt; es una extraordinaria herramienta, no obstante adolece de disparidad en sus configuraciones predeterminadas, algunos inconvenientes de rendimiento e integración con otros componentes de software. Neovim viene a responder a estos inconvenientes y por ahora lo está haciendo muy bien. De hecho, &lt;strong&gt;VIM&lt;/strong&gt; en su versión 8, incorporó muchas mejoras provenientes de &lt;strong&gt;Neovim&lt;/strong&gt;. El tiempo dirá si los proyectos se terminan fusionando. Lo importante es que tenemos una alternativa moderna al casi treintañero VIM.&lt;/p&gt;
&lt;h2 id="notas"&gt;Notas&lt;/h2&gt;
&lt;p&gt;[ &lt;sub&gt;^1&lt;/sub&gt; ]: &lt;a href="https://www.freedesktop.org/wiki/"&gt;Freedesktop.org&lt;/a&gt;&lt;/p&gt;
&lt;/article&gt;
&lt;/div&gt;</description><category>Artículos Técnicos</category><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/2017/11/20/lo-viejo-lo-bueno-y-lo-nuevo-en-neovim/</guid><pubDate>Mon, 20 Nov 2017 16:25:51 GMT</pubDate></item><item><title>5 ejemplos: Usar la shell sin salir de vim</title><link>https://sergiobelkin.com/posts/2017/09/24/ejecutar-un-comando-sin-salir-de-vim/</link><dc:creator>sebelk</dc:creator><description>&lt;p&gt;A veces estamos trabajando con un archivo y queremos ejecutar una serie de comandos, pero sin salir del editor. Veremos varias maneras de hacerlo.&lt;/p&gt;
&lt;h2&gt;1. El comando Ex shell (sh)&lt;/h2&gt;
&lt;p&gt;&lt;script type="text/javascript" src="https://asciinema.org/a/9tRonpzHnhjlOXRTEKVgqotyu.js" id="asciicast-9tRonpzHnhjlOXRTEKVgqotyu" async=""&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Este comando ((&lt;strong&gt;sh)ell&lt;/strong&gt;)) sirve para abrir una shell sin cerrar el editor.&lt;/p&gt;
&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post.php?post=858&amp;amp;action=edit"&gt;
&lt;blockquote style="margin: 1.2em 0px; border-left: 4px solid #dddddd; padding: 0px 1em; color: #777777; quotes: none;"&gt;
&lt;p style="margin: 0px 0px 1.2em !important;"&gt;&lt;strong&gt;&lt;span style="color: #008000;"&gt;Importante: Para volver de la shell al editor se puede usar el atajo de teclado o &lt;em&gt;Ctrl-d&lt;/em&gt; o bien el comando &lt;/span&gt;&lt;em&gt;&lt;span style="color: #008000;"&gt;exit&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div style="height: 0; width: 0; max-height: 0; max-width: 0; overflow: hidden; font-size: 0em; padding: 0; margin: 0;" title="MDH:PHNwYW4gY2xhc3M9IiI+Jmd0OyBJbXBvcnRhbnRlOiBQYXJhIHZvbHZlciBkZSBsYSBzaGVsbCBh&amp;lt;br /&amp;gt;
bCBlZGl0b3Igc2UgcHVlZGUgdXNhciBlbCBhdGFqbyBkZSB0ZWNsYWRvIG8gPC9zcGFuPjxzcGFu&amp;lt;br /&amp;gt;
IGNsYXNzPSIiPjxzdHJvbmc+Q3RybC1kPC9zdHJvbmc+PC9zcGFuPiBvIGJpZW4gPHNwYW4gY2xh&amp;lt;br /&amp;gt;
c3M9IiI+PHN0cm9uZz5leGl0PC9zdHJvbmc+PC9zcGFuPg=="&gt;​&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;2. Edición de archivos de la shell&lt;/h2&gt;
&lt;p&gt;&lt;script type="text/javascript" src="https://asciinema.org/a/Me57al14JyTKA3HAp1EtmslKL.js" id="asciicast-Me57al14JyTKA3HAp1EtmslKL" async&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Aquí estamos editando el archivo &lt;em&gt;.bashrc&lt;/em&gt;, para que se apliquen los cambios podemos ir a la shell en modo login con:&lt;/p&gt;
&lt;p&gt;&lt;span class="md-line md-end-block md-focus"&gt;&lt;span class="md-expand" spellcheck="false"&gt;&lt;code&gt;:set shell=bash\ –login&lt;/code&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class="markdown-here-wrapper" data-md-url="http://www.sergiobelkin.com/wp-admin/post.php?post=858&amp;amp;action=edit"&gt;
&lt;h2&gt;3. Guardar e ir a la shell&lt;/h2&gt;
&lt;p&gt;En este ejemplo vemos como se puede aplicar los cambios en un servicio&lt;br&gt;
&lt;script type="text/javascript" src="https://asciinema.org/a/VTj93OIlQ07XVWsgk9aGI675n.js" id="asciicast-VTj93OIlQ07XVWsgk9aGI675n" async&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;:w | sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Aquí la clave es el carácter “|” el cual sirve para ejecutar el comando &lt;em&gt;(sh)ell&lt;/em&gt; luego de &lt;em&gt;w&lt;/em&gt;.&lt;/p&gt;
&lt;div style="height: 0; width: 0; max-height: 0; max-width: 0; overflow: hidden; font-size: 0em; padding: 0; margin: 0;" title="MDH:YDpzZXQgc2hlbGw9YmFzaFwgLS1sb2dpbmA="&gt;​&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;4. Ejecución de bajo perfil&lt;/h2&gt;
&lt;p&gt;&lt;script type="text/javascript" src="https://asciinema.org/a/8cJDtBJkSb7wpjH6oQfSw1kw5.js" id="asciicast-8cJDtBJkSb7wpjH6oQfSw1kw5" async&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;El comando &lt;em&gt;silent&lt;/em&gt; ejecuta el comando de manera silenciosa y el comando &lt;em&gt;redraw!&lt;/em&gt; limpia y actualiza la pantalla.&lt;/p&gt;
&lt;h2&gt;5. Ejecutar el archivo en edición&lt;/h2&gt;
&lt;p&gt;Al escribir un script en lugar de guardar, salir, ejecutar el script y volver a editarlo, podemos ejecutarlo directamente desde vim:&lt;/p&gt;
&lt;p&gt;&lt;script type="text/javascript" src="https://asciinema.org/a/UCL2RxbwKoUAm1fBeRPdDg9X9.js" id="asciicast-UCL2RxbwKoUAm1fBeRPdDg9X9" async&gt;&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;La clave en cuestión aquí es el carácter ‘&lt;em&gt;%&lt;/em&gt;‘ que indica el buffer de la ventana actual.&lt;/p&gt;</description><category>Artículos Técnicos</category><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/2017/09/24/ejecutar-un-comando-sin-salir-de-vim/</guid><pubDate>Sun, 24 Sep 2017 12:38:45 GMT</pubDate></item><item><title>10 cosas extraordinarias que podés hacer con VIM</title><link>https://sergiobelkin.com/posts/2016/04/10/vim/</link><dc:creator>sebelk</dc:creator><description>&lt;div style="font-family: 'Roboto Condensed', Tauri, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; overflow-x: hidden; overflow-y: auto; margin: 0px !important; padding: 20px; background-color: #ffffff; color: #222222; line-height: 1.6; -webkit-font-smoothing: antialiased; background: #ffffff;"&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Últimamente este editor ha comenzado a tener mala prensa. Se dice que es difícil, anticuado.&lt;br style="clear: both;"&gt;En este artículo intentaremos mostrar 10 características distintivas de vim. Muchos creen que VIM es parte de un caprichoso rito de iniciación al mundo UNIX/Linux. Usar VIM no es un hábito snob de algunos geeks, sino una manera de aumentar la productividad.&lt;br style="clear: both;"&gt;La cuestión es que algunas distribuciones incluyen de manera predeterminada vi en lugar de VIM. El usuario principiante entonces, al tropeza con aquél, huye hacia otros editores en apariencia más fáciles pero mucho menos potentes. Aquí mostraremos 10 funcionalidades que posee VIM que difícilmente otro editor de texto puede ofrecer, al menos todas juntas.&lt;/p&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Cabe aclarar que el siguiente listado es para usaurios que poseen un conocimiento básico de VIM. ¿Todavías no lo tenés? ¡Usá la herramienta &lt;strong&gt;vimtutor&lt;/strong&gt;!&lt;/p&gt;
&lt;h2 id="0.-interfaz-libre-de-distracciones" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;0. Concentrarte en el texto&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Muchos editores poseen una gran cantidad de botones y de menús, pero eso muchas veces quita espacio en la pantalla, además de distraernos. VIM está libre de esas intereferencias.&lt;br style="clear: both;"&gt;Incluso, tiene plugins y configuraciones para acentuar estas características.&lt;sup id="fnref-f1" class="footnote-ref"&gt;&lt;a style="text-decoration: none; vertical-align: baseline; color: #3269a0;" href="https://sergiobelkin.com/posts/2016/04/10/vim/#fn-f1"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;sup id="fnref-f2" class="footnote-ref"&gt;&lt;a style="text-decoration: none; vertical-align: baseline; color: #3269a0;" href="https://sergiobelkin.com/posts/2016/04/10/vim/#fn-f2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;¿Queremos leer y/o editar archivos de texto o tener que aprendernos para que sirve cada botoncito u opción de cada menú? ¿Qué sentido tiene?&lt;/p&gt;
&lt;h2 id="1.-comprobar-la-ortografía" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;1. Comprobar la ortografía&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;El comando en modo ex:&lt;/p&gt;
&lt;pre style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #cccccc; overflow: auto; padding: 0.5em;"&gt;&lt;code style="border: 1px solid #cccccc; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px 2px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; padding: 0px 5px; font-size: 1em; letter-spacing: -1px;" data-origin=" &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;:setlocal spell spelllang=es_MX &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;p&amp;gt;"&gt;:setlocal spell spelllang=es_MX
&lt;/code&gt;&lt;/pre&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Establece el idioma que utilizará ViM para la corrección ortográfica. El corrector resaltará las palabras con errores. Al situar el cursos en la palabra mal escrita y usar el comando &lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;z=&lt;/code&gt; aparecerá una lista de palabras alternativas para reemplazar la incorrecta.&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/spellcheckvim.png" rel="attachment wp-att-838"&gt;&lt;img class="aligncenter size-large wp-image-838" src="https://sergiobelkin.com/wp-content/uploads/2016/04/spellcheckvim-1024x467.png" alt="Corrección Ortográfica en VIM" width="640" height="292"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="font-family: 'Roboto Condensed', Tauri, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; overflow-x: hidden; overflow-y: auto; margin: 0px !important; padding: 20px; background-color: #ffffff; color: #222222; line-height: 1.6; -webkit-font-smoothing: antialiased; background: #ffffff;"&gt;
&lt;h2 id="2.-operaciones-con-bloques" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;2. Operaciones con bloques&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Es común al editar archivos con código fuente encontrarnos con porciones de texto encerrados entre algunos de estos caracteres:&lt;/p&gt;
&lt;ul&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;&amp;lt;Esto es un Ejemplo&amp;gt;&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;“Esto es un Ejemplo”&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;‘Esto es un ejemplo’&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;(Esto es un ejemplo)&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;[Esto es un ejemplo]&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;{Esto es un ejemplo}&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Para seleccionar el texto encerrado entre signos “&amp;lt;” y “&amp;gt;” podemos usar el siguiente comando:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;vi&amp;lt;&lt;/code&gt;&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Si quisieramos seleccionar el texto incluyendo los signos deberíamos usar:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;va&amp;lt;&lt;/code&gt;&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;En castellano una regla mnemotécnica útil es:&lt;/p&gt;
&lt;ul&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;i: interior&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;a: afuera (inclusive)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Para seleccionar cualquiera de los otros bloques, sencillamente hay que reemplazar el caracter delimitador del bloque.&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Esto es muy útil para archivos html, en la siguiente imagen se muestra como se puede seleccionar todo un tag mediante el comando &lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;vat&lt;/code&gt;:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Por supuesto en lugar del comando inicial &lt;strong&gt;v&lt;/strong&gt; se pueden usar otros tales &lt;strong&gt;d&lt;/strong&gt;, &lt;strong&gt;y&lt;/strong&gt; y &lt;strong&gt;c&lt;/strong&gt;.&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/SelectBlocksVim.png" rel="attachment wp-att-839"&gt;&lt;img class="aligncenter size-full wp-image-839" src="https://sergiobelkin.com/wp-content/uploads/2016/04/SelectBlocksVim.png" alt="Seleccionar bloques en VIM" width="241" height="156"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="3.-viajar-en-el-tiempo-(controlar-ediciones...-casi-como-si-fuera-git)" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;3. Viajar en el tiempo (controlar ediciones… casi como si fuera GIT)&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Este una funcionalidad que ya presenté en un un artículo anterior, pero que tiene sentido mencionar una vez más:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Con Vim se puede volver al estado que tenía el archivo 10 minutos atrás con el comando en el comando en modo ex:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;:earlier 10m&lt;/code&gt;&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Por supuesto, se puede volver al futuro con:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;:later 10m&lt;/code&gt;&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;¿Qué pasa si no se pone ‘m’? En eseo caso se retrocede o avanza la cantidad de ediciones especificada.&lt;/p&gt;
&lt;h2 id="4.-automatización-de-operaciones" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;4. Automatización de operaciones&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Hay una manera muy sencilla de repetir operaciones: y es a través del comando &lt;strong&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #cccccc; padding: 0px 5px; margin: 0px 2px;"&gt;.&lt;/code&gt;&lt;/strong&gt;&lt;br style="clear: both;"&gt;Dicho comando repite el último comando y repetirlo la cantidad que sea necesaria, sencillamente usando el “punto” las veces que sea necesario. Cuando el comando a repetir es muy complejo es una función de extrema utilidad.&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Otra manera de repetir operaciones es anteponiendo un número de veces. Por ejemplo, el comando &lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;10p&lt;/code&gt; pega 10 veces el contenido del buffer.&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;También se pueden usar macros para automatizar tareas utilizando macros:&lt;/p&gt;
&lt;ol style="list-style-type: decimal;"&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Prendemos la grabadora con qa&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Ejecutamos los comandos deseados&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Detenemos la grabadora con q&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Reproducimos el comando con @a&lt;/li&gt;
&lt;/ol&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Por ejemplo podríamos usarlo para estructurar un documento en markdown de la siguiente manera:&lt;/p&gt;
&lt;ol style="list-style-type: decimal;"&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;:set nf+=alpha&lt;/code&gt; (Para habilitar el incremento de caracteres alfabéticos)&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Tipeamos &lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;## A.&lt;/code&gt; (sin las comillas)&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;qa&lt;/code&gt;&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;yyp&lt;/code&gt;&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Usamos el atajo de teclado Ctrl-a (Para incrementar)&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;q&lt;/code&gt;&lt;/li&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Utilizamos 10@a (el número 10 es un ejemplo)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;&lt;script id="asciicast-MlyUokEGwzLYqFlBigtGLNL3y" src="https://asciinema.org/a/MlyUokEGwzLYqFlBigtGLNL3y.js" async&gt;&lt;/script&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="font-family: 'Roboto Condensed', Tauri, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; overflow-x: hidden; overflow-y: auto; margin: 0px !important; padding: 20px; background-color: #ffffff; color: #222222; line-height: 1.6; -webkit-font-smoothing: antialiased; background: #ffffff;"&gt;
&lt;h2 id="5.-abrir-dos-archivos-al-mismo-tiempo" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;5. Abrir dos archivos al mismo tiempo&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Esta función es extremadamente útil. Hay varias maneras de hacerlo, aquí mostraré una manera de hacerlo.&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Por ejemplo, si tenemos un archivo y queremos copiar el contenido de otro archivo, debemos ejecutar este comando en modo ex:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;:split /etc/squid3/squid.CONF&lt;/code&gt;&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Desde luego la ruta del archivo es un ejemplo. Luego podemos copiar, cortar, pegar entre las diferentes como es habitual. Lo más importante es saber como pasar entre ventanas: primero se emplea el atajo de comandos Ctrl-w y luego la tecla de la flecha en dirección a la ventana deseada.&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Si esto parece complicado, se puede usar incluso el modo ex:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;:wincmd j&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="6.-editar-un-archivo-al-vuelo" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;6. Editar un archivo web al vuelo&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Supongamos que estamos copiando código libre de un sitio web a un archivo, podríamos usar el comando siguiente:&lt;/p&gt;
&lt;pre style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #cccccc; overflow: auto; padding: 0.5em;"&gt;&lt;code style="border: 1px solid #cccccc; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px 2px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; padding: 0px 5px; font-size: 1em; letter-spacing: -1px;" data-origin=" &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;vim http://www.fsf.org/index.html &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;p&amp;gt;"&gt;vim http://www.fsf.org/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Luego de presionar Enter se descarga el archivo html y se abre una copia en el editor. ¿No es maravilloso?&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/EditDownloadedWebEVim.png" rel="attachment wp-att-841"&gt;&lt;img class="aligncenter size-large wp-image-841" src="https://sergiobelkin.com/wp-content/uploads/2016/04/EditDownloadedWebEVim-1024x467.png" alt="Editar un archivo descargado al vuelo con VIM" width="640" height="292"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="7.-editar-un-archivo-remoto-a-través-de-ssh" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;7. Editar un archivo remoto a través de ssh&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Este método es múy útil en particular cuando se utilizan claves públicas para autenticar. Hay que hacer así:&lt;/p&gt;
&lt;pre style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #cccccc; overflow: auto; padding: 0.5em;"&gt;&lt;code style="border: 1px solid #cccccc; display: block; font-family: Consolas, Inconsolata, Courier, monospace; font-weight: bold; white-space: pre; margin: 0px 2px; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; padding: 0px 5px; font-size: 1em; letter-spacing: -1px;" data-origin=" &amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;vim scp://root@192.168.80.148//etc/squid3/squid.conf &amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt; &amp;lt;p&amp;gt;"&gt;vim scp://root@192.168.80.148//etc/squid3/squid.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;A diferencia del ejemplo anterior este comando edita efectivamente el archivo remoto. Obviamente usa un archivo local de manera temporaria hasta que guardamos los cambios…&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;div style="font-family: 'Roboto Condensed', Tauri, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; overflow-x: hidden; overflow-y: auto; margin: 0px !important; padding: 20px; background-color: #ffffff; color: #222222; line-height: 1.6; -webkit-font-smoothing: antialiased; background: #ffffff;"&gt;
&lt;h2 id="8.-explorar-archivos" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;8. Explorar archivos&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Aquí mediante el comando&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;:e .&lt;/code&gt;&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Se abre un explorador de archivos que permite por ejemplo copiar archivos de un directorio a otro.&lt;br style="clear: both;"&gt;El procedimiento es tal vez contraintuitivo, pero no por eso es complejo.&lt;/p&gt;
&lt;ul&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Se navega como es habitual en gestor de archivos hasta encontrar el directorio de destino. Ubicado allí el cursos se usa el comando &lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;mt&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim1.png" rel="attachment wp-att-843"&gt;&lt;img class="aligncenter size-large wp-image-843" src="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim1-1024x184.png" alt="Gestor de Archivos en VIM" width="640" height="115"&gt;&lt;/a&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/FIleManagementVIm.png" rel="attachment wp-att-846"&gt;&lt;img class="aligncenter size-large wp-image-846" src="https://sergiobelkin.com/wp-content/uploads/2016/04/FIleManagementVIm-1024x469.png" alt="FIleManagementVIm" width="640" height="293"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li style="display: list-item; line-height: 1.4em;"&gt;Luego buscamos el archivo que queremos copiar y usamos los comandos &lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;mf&lt;/code&gt; y &lt;code style="border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-wrap: break-word; border: 1px solid #efefef; padding: 0.2em 0.5em; margin: 0px 2px; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 85%; background-color: rgba(0, 0, 0, 0.0196078);"&gt;mc&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;¡Listo! Se copió el archivo al directorio de destino.&lt;/p&gt;
&lt;h2 id="9.-autocompletar-texto" style="clear: both; font-size: 1.8em; font-weight: bold; margin: 1.275em 0px 0.85em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e6e6e6;"&gt;9. Autocompletar texto&lt;/h2&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;Si tenemos que volver a tipear una palabra larga podemos hacerlo rápida y fácilmente con el atajo de teclado Ctrl-p.&lt;/p&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim.png" rel="attachment wp-att-842"&gt;&lt;img class="aligncenter size-full wp-image-842" src="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim.png" alt="Autocompletar palabras en VIM" width="851" height="516"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="margin-top: 0px; margin: 1em 0px; word-wrap: break-word;"&gt;&lt;br style="clear: both;"&gt;En el ejemplo siguiente queremos ingresar rápidamente la función &lt;em&gt;isunordered&lt;/em&gt;:&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;VIM tiene además, otras maneras de completar téxto fácilmente mediante el atajo de teclado Ctrl-x. Por ejemplo ingresando luego el atajo de teclado Ctrl-f, podremos escribir rutas de archivos velozmente:&lt;/p&gt;
&lt;/div&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim1.png" rel="attachment wp-att-843"&gt;&lt;img class="aligncenter size-large wp-image-843" src="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim1-1024x184.png" alt="Autocompletar nombres de archivos en VIM" width="640" height="115"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div style="font-family: 'Roboto Condensed', Tauri, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, SimSun, 'Lucida Grande', 'Lucida Sans Unicode', 'Lucida Sans', 'Segoe UI', AppleSDGothicNeo-Medium, 'Malgun Gothic', Verdana, Tahoma, sans-serif; font-size: 15px; overflow-x: hidden; overflow-y: auto; margin: 0px !important; padding: 20px; background-color: #ffffff; color: #222222; line-height: 1.6; -webkit-font-smoothing: antialiased; background: #ffffff;"&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;Cabe aclarar que todos estos atajos se usan en modo Insert.&lt;/p&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;¡Qué lo disfruten!&lt;/p&gt;
&lt;hr style="border: 1px solid #e6e6e6;"&gt;
&lt;ol style="list-style-type: decimal;"&gt;
&lt;li id="fn-f1" style="display: list-item; line-height: 1.4em;"&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;a style="text-decoration: none; vertical-align: baseline; color: #3269a0;" href="http://thedarnedestthing.com/distraction%20free%20vim"&gt;distraction free vim&lt;/a&gt;&lt;a style="text-decoration: none; vertical-align: baseline; color: #3269a0;" href="https://sergiobelkin.com/posts/2016/04/10/vim/#fnref-f1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn-f2" style="display: list-item; line-height: 1.4em;"&gt;
&lt;p style="margin: 1em 0px; word-wrap: break-word;"&gt;&lt;a style="text-decoration: none; vertical-align: baseline; color: #3269a0;" href="http://www.laktek.com/2012/09/05/distraction-free-writing-with-vim/"&gt;Distraction Free Writing with Vim&lt;/a&gt;&lt;a style="text-decoration: none; vertical-align: baseline; color: #3269a0;" href="https://sergiobelkin.com/posts/2016/04/10/vim/#fnref-f2"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/2016/04/10/vim/</guid><pubDate>Sun, 10 Apr 2016 08:52:29 GMT</pubDate></item><item><title>Cosas sorprendentes con ViM</title><link>https://sergiobelkin.com/posts/2010/09/27/cosas-sorprendentes-con-vim/</link><dc:creator>sebelk</dc:creator><description>&lt;h2&gt;Sorpresa 1&lt;/h2&gt;
&lt;p&gt;Abrir directamente un archivo en un determinado número de  linea, por ejemplo: línea 247:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vim +247 /ruta/al/archivo&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Sorpresa 2&lt;/h2&gt;
&lt;p&gt;Ejecutar un comando en modo Ex al abrir un archivo:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vim +:set nu /ruta/al/archivo&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Sorpresa 3&lt;/h2&gt;
&lt;p&gt;Con Vim se puede volver al estado que tenía el archivo 10 minutos atrás con el comando en el comando en modo ex:&lt;br&gt;
&lt;code&gt;&lt;br&gt;
:earlier 10m&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Por supuesto, se puede volver al futuro con:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;:later 10m&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;¿Qué pasa si no se pone ‘m’? En eseo caso se retrocede o avanza la cantidad de ediciones especificada.&lt;/p&gt;
&lt;h2&gt;Sorpresa 4&lt;/h2&gt;
&lt;p&gt;Convertir un archivo en html en modo ex se hace así:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;:TOhtml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;El resultado se puede ver &lt;a href="http://www.sergiobelkin.com/wp-content/uploads/2010/10/makefile.in.html" target="_blank"&gt;aquí&lt;/a&gt; es un ejemplo de un archivo Makefile.in convertido a HTML.&lt;/p&gt;
&lt;h2&gt;Sorpresa 5&lt;/h2&gt;
&lt;p&gt;Editar un archivo de manera remota:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vim ftp://remotehostname.com/myfile&lt;/code&gt;&lt;/p&gt;</description><category>editores de texto</category><category>vi/vim/neovim</category><guid>https://sergiobelkin.com/posts/2010/09/27/cosas-sorprendentes-con-vim/</guid><pubDate>Mon, 27 Sep 2010 06:54:18 GMT</pubDate></item></channel></rss>