<?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 vim)</title><link>https://sergiobelkin.com/</link><description></description><atom:link href="https://sergiobelkin.com/categories/vim.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>Fri, 19 Jun 2026 01:04:34 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><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 tené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 cómo un usuario de Vim puede comenzar a usar 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 de primera clase, 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;Neovim usa una implementación de Lua llamada &lt;strong&gt;LuaJIT&lt;/strong&gt;, que compila código Lua a código máquina nativo durante la ejecución. Es un detalle técnico relevante, pero no la razón principal para preferir Lua sobre Vim script en la configuración del editor — en ese terreno el cuello de botella suele estar en el startup time y en el diseño de los plugins, no en la velocidad del lenguaje.&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;Por qué importa esto en la práctica:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La &lt;strong&gt;API de Neovim en Lua&lt;/strong&gt; es estructurada y predecible (tablas, namespaces como &lt;code&gt;vim.api.*&lt;/code&gt;, &lt;code&gt;vim.opt&lt;/code&gt;), donde Vim script ofrecía variables globales y comandos planos.&lt;/li&gt;
&lt;li&gt;El &lt;strong&gt;ecosistema de plugins modernos asume Lua como lenguaje nativo&lt;/strong&gt; — los gestores actuales (&lt;code&gt;lazy.nvim&lt;/code&gt;, &lt;code&gt;packer.nvim&lt;/code&gt;), los runtime helpers, los plugins de LSP y UI conviven mejor con configs en Lua.&lt;/li&gt;
&lt;li&gt;La &lt;strong&gt;modularización con &lt;code&gt;require&lt;/code&gt;&lt;/strong&gt; permite dividir la configuración en archivos lógicos con scoping limpio, algo que Vim script soporta de forma rudimentaria.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LuaJIT existe y es rápido, pero esa rapidez rara vez es lo que el sysadmin nota al usar Neovim — lo que nota es que su configuración escala mejor y se integra con el ecosistema sin fricciones.&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;Las tablas son la única estructura de datos compuesta en Lua&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.api&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-globales-mas-importantes-en-neovim"&gt;El podio de las tablas globales más importantes en Neovim&lt;/h3&gt;
&lt;p&gt;Estas son las tres tablas globales 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 globales de nivel superior&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;Acceso a opciones con métodos (&lt;code&gt;:append&lt;/code&gt;, &lt;code&gt;:remove&lt;/code&gt;, &lt;code&gt;:prepend&lt;/code&gt;); requerido para listas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set nrformats+=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 = 0&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;nnoremap ñ :wq&amp;lt;CR&amp;gt;&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;code&gt;let l:var = 10&lt;/code&gt; (function-local), &lt;code&gt;s:&lt;/code&gt;, &lt;code&gt;b:&lt;/code&gt;, &lt;code&gt;w:&lt;/code&gt; por contexto&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() ... endfunction&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;code&gt;{a, b -&amp;gt; a + b}&lt;/code&gt; (lambda, desde Vim 8.0)&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="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 del archivo &lt;code&gt;init.vim&lt;/code&gt;:&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;nrformats&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 a &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 gestionar plugins en Vim&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 &lt;code&gt;~/.config/nvim&lt;/code&gt; es obligatorio.&lt;/li&gt;
&lt;li&gt;El directorio &lt;code&gt;~/.config/nvim/lua&lt;/code&gt; &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 dentro 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 los plugins primero — algunas configuraciones&lt;/span&gt;
&lt;span class="c1"&gt;-- (como `colorscheme`) dependen de tenerlos disponibles en el runtimepath&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;span class="c1"&gt;-- Cargamos nuestros módulos (el require ejecuta el archivo;&lt;/span&gt;
&lt;span class="c1"&gt;-- el efecto viene del side-effect, no del valor capturado)&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="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="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="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;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Archivo ~/.config/nvim/lua/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="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;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota sobre &lt;code&gt;vim.keymap.set&lt;/code&gt;&lt;/strong&gt;: usa &lt;code&gt;remap = false&lt;/code&gt; por default, así que &lt;code&gt;map('n', 'ñ', ':wq&amp;lt;CR&amp;gt;')&lt;/code&gt; ya es equivalente a &lt;code&gt;nnoremap&lt;/code&gt; (no a &lt;code&gt;nmap&lt;/code&gt;). El "nore" que en VimL diferenciaba &lt;code&gt;nnoremap&lt;/code&gt; de &lt;code&gt;nmap&lt;/code&gt; está implícito en el default de la API Lua.&lt;/p&gt;
&lt;/blockquote&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;nrformats&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;-- Comando auxiliar para correr cosas en shell silenciado&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;'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="c1"&gt;-- Build del sitio Nikola&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;'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;/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 porque 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 dejamos en Vim script (con código Lua embebido):&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 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 tipear tanto 😉.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nota sobre redefinición de comandos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vim.api.nvim_create_user_command&lt;/code&gt; &lt;strong&gt;sobrescribe por default&lt;/strong&gt; un comando con el mismo nombre (la opción &lt;code&gt;force&lt;/code&gt; tiene valor &lt;code&gt;true&lt;/code&gt; por defecto, según la doc oficial de la API). Es decir: podés llamar dos veces a &lt;code&gt;nvim_create_user_command('Nbuild', ...)&lt;/code&gt; y la segunda definición reemplaza a la primera sin error. No hace falta borrar antes con &lt;code&gt;nvim_del_user_command&lt;/code&gt;. Esto es distinto del &lt;code&gt;:command&lt;/code&gt; de VimL, que sí requiere &lt;code&gt;command!&lt;/code&gt; para sobrescribir — la API Lua no hereda esa restricción.&lt;/p&gt;
&lt;p&gt;El ejemplo de &lt;code&gt;Nbuild&lt;/code&gt; deja ver diferencias más grandes entre VimL y Lua. Las analizamos en cinco dimensiones:&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
  vim.api.nvim_create_user_command('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="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="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;-- registra los user commands al cargarse&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="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;-- aplica colorscheme y filetype detection&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="w"&gt;               &lt;/span&gt;&lt;span class="c1"&gt;-- registra los atajos de teclado&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="w"&gt;              &lt;/span&gt;&lt;span class="c1"&gt;-- opciones generales de configuración&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 al viejo &lt;code&gt;.vimrc&lt;/code&gt;) a &lt;code&gt;init.lua&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Migrar de Vim script a Lua no es una mejora cosmética: cambia las posibilidades de la configuración. Lo que en Vim script son comandos breves, en Lua son funciones programables — más verbosas, sí, pero abiertas a control de errores con &lt;code&gt;pcall&lt;/code&gt;, modularización con &lt;code&gt;require&lt;/code&gt; y un ecosistema de plugins que ya asume Lua como lenguaje nativo.&lt;/p&gt;
&lt;p&gt;La estructura mostrada acá es una entre muchas. El esqueleto &lt;code&gt;init.lua&lt;/code&gt; + módulos en &lt;code&gt;lua/&lt;/code&gt; se sostiene porque escala: cada archivo crece sin contaminar al resto, y la configuración deja de ser una pared de líneas para volverse un conjunto de piezas que podés rearmar cuando lo necesites.&lt;/p&gt;
&lt;p&gt;Lo que no migramos en este post es la configuración de plugins, que dejamos en &lt;code&gt;plugins.vim&lt;/code&gt;. Reemplazar &lt;strong&gt;vim-plug&lt;/strong&gt; por un gestor en Lua como &lt;strong&gt;lazy.nvim&lt;/strong&gt; es el siguiente paso natural — y tema de &lt;a href="https://sergiobelkin.com/posts/como-migrar-de-vim-plug-a-lazynvim/"&gt;este otro post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Al cierre del post dejé un resumen de 10 conceptos clave para tener a mano cuando empieces a extender tu config.&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;Resumen de los 10 conceptos clave de Lua en Neovim. Los 3 marcados como &lt;em&gt;(esencial)&lt;/em&gt; son los que vimos al principio; el resto extiende esa base:&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;em&gt;(esencial)&lt;/em&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;em&gt;(esencial)&lt;/em&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;em&gt;(esencial)&lt;/em&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;&lt;code&gt;vim.o&lt;/code&gt; da acceso directo al valor; &lt;code&gt;vim.opt&lt;/code&gt; lo envuelve en un objeto type-aware con métodos (necesario para 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;code&gt;:help lua&lt;/code&gt;)&lt;/a&gt; — referencia completa de la API Lua de Neovim.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://neovim.io/doc/user/lua-guide.html"&gt;Guía de Lua para Neovim (&lt;code&gt;:help lua-guide&lt;/code&gt;)&lt;/a&gt; — survival kit oficial para configurar Neovim en Lua.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.lua.org/manual/5.1/"&gt;Manual de referencia de Lua 5.1&lt;/a&gt; — definición oficial del lenguaje (LuaJIT, que usa Neovim, está basado en esta versión).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://neovim.io/doc/lua-resources/"&gt;Recursos de Lua recomendados por Neovim&lt;/a&gt; — curaduría oficial de tutoriales y libros.&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; — otra mirada sobre migración hacia Neovim+Lua, desde VSCode.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kushcreates.com/blogs/neovim-is-better-but-why-developers-arent-switching-to-it"&gt;NeoVim Is Better, But Why Developers Aren't Switching To It?&lt;/a&gt; — perspectiva crítica sobre la adopción de Neovim.&lt;/li&gt;
&lt;/ul&gt;</description><category>Lua</category><category>Neovim</category><category>vim</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>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>vim</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="https://sergiobelkin.com/posts/mark-text-markdown-en-tiempo-real/"&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>herramientas</category><category>markdown</category><category>vim</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;h3 id="caracteristicas"&gt;Características&lt;/h3&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;h3 id="la-configuracion-predeterminada-incluye-las-siguientes-funcionalidades"&gt;La configuración predeterminada incluye las siguientes funcionalidades:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cuando se detecta que un archivo ha sido cambiado dentro de Vim, automáticamente lo lee de vuelta.&lt;/li&gt;
&lt;li&gt;Permite borrar una autoindentación,  saltos de línea y al comienzo de inserción.&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;Resalta los resultados coincidentes de búsquedas&lt;/li&gt;
&lt;li&gt;Realiza búsquedas incrementales&lt;/li&gt;
&lt;li&gt;Muestra siempre la línea de estado&lt;/li&gt;
&lt;li&gt;Ahora se pueden ver mejor las tabulaciones y espacios al final de cada línea&lt;/li&gt;
&lt;li&gt;Muestr el comando que se está ejecutando&lt;/li&gt;
&lt;li&gt;Manejo más inteligente de tabulaciones&lt;/li&gt;
&lt;li&gt;Asume una terminal de conexión rápida&lt;/li&gt;
&lt;li&gt;La campanilla está deshabilitada para todos los eventos&lt;/li&gt;
&lt;li&gt;El directorio para temporales está en ~/.local/share/nvim/swap [&lt;sup&gt;^1&lt;/sup&gt;].&lt;/li&gt;
&lt;li&gt;El comando &lt;code&gt;display&lt;/code&gt; muestra la última línea de los registros.&lt;/li&gt;
&lt;li&gt;Justifica automáticamente usando el ancho del texto, inserción y borrado inteligente de caracteres de comentarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="configuracion"&gt;Configuración&lt;/h3&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;!-- --&gt;

&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'nvim'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
  &lt;span class="n"&gt;Plug&lt;/span&gt; &lt;span class="s1"&gt;'Shougo/deoplete.nvim'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;'do'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;':UpdateRemotePlugins'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
  &lt;span class="n"&gt;Plug&lt;/span&gt; &lt;span class="s1"&gt;'vim-airline/vim-airline'&lt;/span&gt; 
&lt;span class="k"&gt;else&lt;/span&gt; 
  &lt;span class="n"&gt;Plug&lt;/span&gt; &lt;span class="s1"&gt;'Shougo/deoplete.nvim'&lt;/span&gt; 
  &lt;span class="n"&gt;Plug&lt;/span&gt; &lt;span class="s1"&gt;'roxma/nvim-yarp'&lt;/span&gt; 
  &lt;span class="n"&gt;Plug&lt;/span&gt; &lt;span class="s1"&gt;'roxma/vim-hug-neovim-rpc'&lt;/span&gt; 
  &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;powerline.vim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;powerline_setup&lt;/span&gt; 
  &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;powerline_setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
  &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;powerline_setup&lt;/span&gt; 
  &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;laststatus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; 
  &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;t_Co&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; 
&lt;span class="n"&gt;endif&lt;/span&gt;

&lt;span class="n"&gt;let&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;deoplete&lt;/span&gt;&lt;span class="c1"&gt;#enable_at_startup = 1&lt;/span&gt;

&lt;span class="n"&gt;neoterm&lt;/span&gt; 
&lt;span class="n"&gt;Plug&lt;/span&gt; &lt;span class="s1"&gt;'kassio/neoterm'&lt;/span&gt;

&lt;span class="s2"&gt;"call vundle#end()            "&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; 
&lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="c1"&gt;#end()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;h3 id="nuevas-funcionalidades-provenientes-de-plugins"&gt;Nuevas funcionalidades provenientes de plugins&lt;/h3&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 alt="neoterm" src="https://sergiobelkin.com/wp-content/uploads/2017/11/Screenshot_20171217_203358-1024x544.png"&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;h3 id="conclusion"&gt;Conclusión&lt;/h3&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;h3 id="notas"&gt;Notas&lt;/h3&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;</description><category>Neovim</category><category>vim</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;h3 id="1-el-comando-ex-shell-sh"&gt;1. El comando Ex shell (sh)&lt;/h3&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;blockquote&gt;
&lt;p&gt;&lt;strong&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;/em&gt;exit&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="2-edicion-de-archivos-de-la-shell"&gt;2. Edición de archivos de la shell&lt;/h3&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;code&gt;:set shell=bash\ -login&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="3-guardar-e-ir-a-la-shell"&gt;3. Guardar e ir a la shell&lt;/h3&gt;
&lt;p&gt;En este ejemplo vemos como se puede aplicar los cambios en un servicio  &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;h3 id="4-ejecucion-de-bajo-perfil"&gt;4. Ejecución de bajo perfil&lt;/h3&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;h3 id="5-ejecutar-el-archivo-en-edicion"&gt;5. Ejecutar el archivo en edición&lt;/h3&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;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>vim</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;p&gt;Últimamente este editor ha comenzado a tener mala prensa. Se dice que es difícil, anticuado.&lt;br&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&gt;
La cuestión es que algunas distribuciones incluyen de manera predeterminada vi en lugar de VIM. El usuario principiante entonces, al tropezar con aquel, 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&gt;Cabe aclarar que el siguiente listado es para usuarios que poseen un conocimiento básico de VIM. ¿Todavía no lo tenés? ¡Usá la herramienta &lt;strong&gt;vimtutor&lt;/strong&gt;!&lt;/p&gt;
&lt;h3 id="0-concentrarte-en-el-texto"&gt;0. Concentrarte en el texto&lt;/h3&gt;
&lt;p&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 interferencias.&lt;br&gt;
Incluso, tiene plugins y configuraciones para acentuar estas características.&lt;sup&gt;&lt;a href="https://sergiobelkin.com/posts/2016/04/10/vim/#fn-f1"&gt;1&lt;/a&gt;&lt;a href="https://sergiobelkin.com/posts/2016/04/10/vim/#fn-f2"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&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;h3 id="1-comprobar-la-ortografia"&gt;1. Comprobar la ortografía&lt;/h3&gt;
&lt;p&gt;El comando en modo ex:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code literal-block"&gt;:setlocal spell spelllang=es_MX
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Establece el idioma que utilizará ViM para la corrección ortográfica. El corrector resaltará las palabras con errores. Al situar el cursor en la palabra mal escrita y usar el comando &lt;code&gt;z=&lt;/code&gt; aparecerá una lista de palabras alternativas para reemplazar la incorrecta.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/spellcheckvim.png"&gt;&lt;img alt="Corrección Ortográfica en VIM" src="https://sergiobelkin.com/wp-content/uploads/2016/04/spellcheckvim-1024x467.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="2-operaciones-con-bloques"&gt;2. Operaciones con bloques&lt;/h3&gt;
&lt;p&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&gt;\&amp;lt;Esto es un Ejemplo&amp;gt;&lt;/li&gt;
&lt;li&gt;“Esto es un Ejemplo”&lt;/li&gt;
&lt;li&gt;‘Esto es un ejemplo’&lt;/li&gt;
&lt;li&gt;(Esto es un ejemplo)&lt;/li&gt;
&lt;li&gt;[Esto es un ejemplo]&lt;/li&gt;
&lt;li&gt;{Esto es un ejemplo}&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para seleccionar el texto encerrado entre signos “\&amp;lt;” y “&amp;gt;” podemos usar el siguiente comando:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vi&amp;lt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Si quisieramos seleccionar el texto incluyendo los signos deberíamos usar:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;va&amp;lt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;En castellano una regla mnemotécnica útil es:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;i: interior&lt;/li&gt;
&lt;li&gt;a: afuera (inclusive)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para seleccionar cualquiera de los otros bloques, sencillamente hay que reemplazar el caracter delimitador del bloque.&lt;/p&gt;
&lt;p&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&gt;vat&lt;/code&gt;:&lt;/p&gt;
&lt;p&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&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/SelectBlocksVim.png"&gt;&lt;img alt="Seleccionar bloques en VIM" src="https://sergiobelkin.com/wp-content/uploads/2016/04/SelectBlocksVim.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="3-viajar-en-el-tiempo-controlar-ediciones-casi-como-si-fuera-git"&gt;3. Viajar en el tiempo (controlar ediciones… casi como si fuera GIT)&lt;/h3&gt;
&lt;p&gt;Esta es una funcionalidad que ya presenté en un artículo anterior, pero que tiene sentido mencionar una vez más:&lt;/p&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;/p&gt;
&lt;p&gt;&lt;code&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;h3 id="4-automatizacion-de-operaciones"&gt;4. Automatización de operaciones&lt;/h3&gt;
&lt;p&gt;Hay una manera muy sencilla de repetir operaciones: y es a través del comando &lt;strong&gt;&lt;code&gt;.&lt;/code&gt;&lt;/strong&gt;&lt;br&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&gt;Otra manera de repetir operaciones es anteponiendo un número de veces. Por ejemplo, el comando &lt;code&gt;10p&lt;/code&gt; pega 10 veces el contenido del buffer.&lt;/p&gt;
&lt;p&gt;También se pueden usar macros para automatizar tareas utilizando macros:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Prendemos la grabadora con qa&lt;/li&gt;
&lt;li&gt;Ejecutamos los comandos deseados&lt;/li&gt;
&lt;li&gt;Detenemos la grabadora con q&lt;/li&gt;
&lt;li&gt;Reproducimos el comando con @a&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Por ejemplo podríamos usarlo para estructurar un documento en markdown de la siguiente manera:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;:set nf+=alpha&lt;/code&gt; (Para habilitar el incremento de caracteres alfabéticos)&lt;/li&gt;
&lt;li&gt;Tipeamos &lt;code&gt;## A.&lt;/code&gt; (sin las comillas)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qa&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yyp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Usamos el atajo de teclado Ctrl-a (Para incrementar)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;q&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Utilizamos 10@a (el número 10 es un ejemplo)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="5-abrir-dos-archivos-al-mismo-tiempo"&gt;5. Abrir dos archivos al mismo tiempo&lt;/h3&gt;
&lt;p&gt;Esta función es extremadamente útil. Hay varias maneras de hacerlo, aquí mostraré una manera de hacerlo.&lt;/p&gt;
&lt;p&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&gt;&lt;code&gt;:split /etc/squid3/squid.CONF&lt;/code&gt;&lt;/p&gt;
&lt;p&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&gt;Si esto parece complicado, se puede usar incluso el modo ex:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;:wincmd j&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="6-editar-un-archivo-web-al-vuelo"&gt;6. Editar un archivo web al vuelo&lt;/h3&gt;
&lt;p&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;div class="code"&gt;&lt;pre class="code literal-block"&gt;vim http://www.fsf.org/index.html
&lt;/pre&gt;&lt;/div&gt;

&lt;p&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&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/EditDownloadedWebEVim.png"&gt;&lt;img alt="Editar un archivo descargado al vuelo con VIM" src="https://sergiobelkin.com/wp-content/uploads/2016/04/EditDownloadedWebEVim-1024x467.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="7-editar-un-archivo-remoto-a-traves-de-ssh"&gt;7. Editar un archivo remoto a través de ssh&lt;/h3&gt;
&lt;p&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;div class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span class="n"&gt;vim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scp&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//root@192.168.80.148//etc/squid3/squid.conf&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&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;h3 id="8-explorar-archivos"&gt;8. Explorar archivos&lt;/h3&gt;
&lt;p&gt;Aquí mediante el comando&lt;/p&gt;
&lt;p&gt;&lt;code&gt;:e .&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Se abre un explorador de archivos que permite por ejemplo copiar archivos de un directorio a otro.&lt;br&gt;
El procedimiento es tal vez contraintuitivo, pero no por eso es complejo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se navega como es habitual en gestor de archivos hasta encontrar el directorio de destino. Ubicado allí el cursor se usa el comando &lt;code&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"&gt;&lt;img alt="Gestor de Archivos en VIM" src="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim1-1024x184.png"&gt;&lt;/a&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/FIleManagementVIm.png"&gt;&lt;img alt="FIleManagementVIm" src="https://sergiobelkin.com/wp-content/uploads/2016/04/FIleManagementVIm-1024x469.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Luego buscamos el archivo que queremos copiar y usamos los comandos &lt;code&gt;mf&lt;/code&gt; y &lt;code&gt;mc&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;¡Listo! Se copió el archivo al directorio de destino.&lt;/p&gt;
&lt;h3 id="9-autocompletar-texto"&gt;9. Autocompletar texto&lt;/h3&gt;
&lt;p&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&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim.png"&gt;&lt;img alt="Autocompletar palabras en VIM" src="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En el ejemplo siguiente queremos ingresar rápidamente la función &lt;em&gt;isunordered&lt;/em&gt;:&lt;/p&gt;
&lt;p&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;p&gt;&lt;a href="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim1.png"&gt;&lt;img alt="Autocompletar nombres de archivos en VIM" src="https://sergiobelkin.com/wp-content/uploads/2016/04/autocompleteVim1-1024x184.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cabe aclarar que todos estos atajos se usan en modo Insert.&lt;/p&gt;
&lt;p&gt;¡Qué lo disfruten!&lt;/p&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://thedarnedestthing.com/distraction%20free%20vim"&gt;distraction free vim&lt;/a&gt;&lt;a href="https://sergiobelkin.com/posts/2016/04/10/vim/#fnref-f1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.laktek.com/2012/09/05/distraction-free-writing-with-vim/"&gt;Distraction Free Writing with Vim&lt;/a&gt;&lt;a href="https://sergiobelkin.com/posts/2016/04/10/vim/#fnref-f2"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description><category>vim</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;h3 id="sorpresa-1"&gt;Sorpresa 1&lt;/h3&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;h3 id="sorpresa-2"&gt;Sorpresa 2&lt;/h3&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;h3 id="sorpresa-3"&gt;Sorpresa 3&lt;/h3&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;/p&gt;
&lt;p&gt;&lt;code&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;h3 id="sorpresa-4"&gt;Sorpresa 4&lt;/h3&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 es un ejemplo de un archivo Makefile.in convertido a HTML.&lt;/p&gt;
&lt;h3 id="sorpresa-5"&gt;Sorpresa 5&lt;/h3&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>vim</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>