Uso de Plugins en NeoVim
¿Qué es lo que hace grande a Neovim? Que posee pequeños, pero múy convenientes mejoras acorde a los nuevos tiempos, pero sin reinventar toda la rueda. A veces es buena tener que tirar todo abajo, crear algo completamente nuevo, y empezar todo desde cero. Sí, a veces, pero no siempre, Neovim mantiene todo lo bueno de Vim. Como lo dicen sus desarrolladores:
In matters of taste, prefer Vim/Unix tradition. If there is no relevant Vim/Unix tradition, consider the "common case".
Ya hemos hablado sobre Neovim alguna vez en Lo viejo, lo bueno y lo nuevo en Neovim . Se pueden extender las funcionalidades de neovim, de manera similar a las de su predecesor, el editor Vim. Estas extensiones están escritas en un lenguaje de scripting conocido también VimL. Las extensiones se conocen como plugins y es así como las llamaremos de aquí en más. También tengamos en cuenta que muchas de las cosas que discutiremos aquí aplican para Vim también.
Hay dos tipos de plugins:
- Globales: Funcionan para todo tipo de archivos.
- Filetype: Sirven para un tipo particular de archivos.
El siguiente listado muestra plugins globales que forman parte del core de neovim:
ls -l /usr/share/nvim/runtime/plugin total 60 -rw-r--r-- 1 root root 411 mar 26 10:48 editorconfig.lua -rw-r--r-- 1 root root 3677 mar 26 10:48 gzip.vim -rw-r--r-- 1 root root 904 mar 26 10:48 man.lua -rw-r--r-- 1 root root 138 mar 26 10:48 matchit.vim -rw-r--r-- 1 root root 7966 mar 26 10:48 matchparen.vim -rw-r--r-- 1 root root 152 mar 26 10:48 netrwPlugin.vim -rw-r--r-- 1 root root 2160 mar 26 10:48 osc52.lua -rw-r--r-- 1 root root 2017 mar 26 10:48 rplugin.vim -rw-r--r-- 1 root root 1778 mar 26 10:48 shada.vim -rw-r--r-- 1 root root 236 mar 26 10:48 spellfile.vim -rw-r--r-- 1 root root 2527 mar 26 10:48 tarPlugin.vim -rw-r--r-- 1 root root 442 mar 26 10:48 tohtml.lua -rw-r--r-- 1 root root 202 mar 26 10:48 tutor.vim -rw-r--r-- 1 root root 2642 mar 26 10:48 zipPlugin.vim
Plugin | Funcionalidad |
---|---|
editorconfig | Busca y lee archivos .editorconfig para aplicar reglas de indentación, fines de línea y codificación |
gzip | Editar archivos comprimidos con gzip |
man | Abrir páginas del manual en el editor |
matchit |
Extiende la funcionalidad del comando %
|
matchparen | Resalta paréntesis coincidentes |
netrwPlugin | Maneja la transferencia de archivos y listado de directorios remotos a través de una red |
osc52 | 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 |
rplugin | 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) |
shada | Datos Compartidos entre las sesiones de neovim |
spellfile | Descarga de archivos de ortografía |
tarPlugin | Exploración de tarballs |
tohtml | Conversor a html |
tutor | Tutorial |
zipPlugin | Exploración de archivos zip |
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 lua. 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.
Si consideramos el archivo del plugin man contiene lo siguiente:
if vim.g.loaded_man ~= nil then return end vim.g.loaded_man = true vim.api.nvim_create_user_command('Man', function(params) local man = require('man') if params.bang then man.init_pager() else local err = man.open_page(params.count, params.smods, params.fargs) if err then vim.notify('man.lua: ' .. err, vim.log.levels.ERROR) end end end, { bang = true, bar = true, range = true, addr = 'other', nargs = '*', complete = function(...) return require('man').man_complete(...) end, }) local augroup = vim.api.nvim_create_augroup('nvim.man', {}) vim.api.nvim_create_autocmd('BufReadCmd', { group = augroup, pattern = 'man://*', nested = true, callback = function(params) local err = require('man').read_page(assert(params.match:match('man://(.*)'))) if err then vim.notify('man.lua: ' .. err, vim.log.levels.ERROR) end end, })
Además, neovim posee una API con la cual se pueden hacer desarrollos en otros lenguajes de programación, es así como existen:
- neovim-java - Java Client for Neovim API | neovim-java
- neovimi (node.js)
- nvim-client - LuaRocks (es un cliente Lua puro para comunicarse con un servidor Neovim usando RPC)
- equalsraf/neovim-qt: Neovim client library and GUI, in Qt5.
Se pueden escribir plugins en lenguajes distintos a VimL, por ejemplo far.vim está desarrollado en python:
Se debe ejecutar :UpdateRemotePlugins
cada vez que un plugin remoto se instale, se actualice, o se borre. Esto generará o actualizará un archivo manifest, por ejemplo:
cat ~/.local/share/nvim/rplugin.vim " node plugins " python3 plugins call remote#host#RegisterPlugin('python3', '/root/.local/share/nvim/plugged/far.vim/rplugin/python3/far', [ \ {'sync': v:false, 'name': '_far_nvim_rpc_async_invoke', 'type': 'function', 'opts': {}}, \ ]) " ruby plugins " python plugins
Paquetes de plugins
Photo by Handy Wicaksono on Unsplash
Desde Vim 8.0 el editor cuenta con soporte nativo para paquetes de plugins. Podemos compararlo con los paquetes de software en Linux (como los paquetes RPM o DEB); por ejemplo, el paquete de sistema coreutils incluye varias utilidades a la vez (tr, sort, tail, etc.). De forma análoga, un paquete en Vim puede contener varios plugins simultáneamente.
Es decir, considerando el siguiente escenario:
El paquete lightline.vim se va a cargar automáticamente al abrir el editor, mientras que el otro plugin toggleterm podrá activarse con el comando :packadd toggleterm.nvim
Algo interesante en neovim es que podemos ver los plugins que ya vienen con el editor con el comando :help standard-plugin-list
y con :help local-additions
los paquetes que vamos agregando:
Gestores de plugins
Ahora bien, la manera nativa de manejar paquetes de Vim (que Neovim toma) es un tanto manual. Es muy ventajoso usar un gestor de plugins, el cual siguiendo la analogía con paquetes rpm (o deb) sería algo parecido a lo que representa yum/dnf/zypper respectivamente).
Existen varios gestores de plugins:
- vim-packager: Vim plugin manager that utilizes "jobs" and "pack" features.
- egalpin/apt-vim: Fully-automated, Cross-platform Plugin Manager for Vim
- MarcWeber/vim-addon-manager: manage and install vim plugins (including their dependencies) in a sane way. If you have any trouble contact me. Usually I reply within 24 hours
- Shougo/dein.vim: Dark powered Vim/Neovim plugin manager
- VundleVim/Vundle.vim: Vundle, the plug-in manager for Vim
- junegunn/vim-plug: Minimalist Vim Plugin Manager
Yo uso vim-plug porque:
- Requiere muy poca configuración: una lista con los paquetes de plugins deseados.
- Instala y actualiza todos los paquetes de nuestra lista o los que seleccionemos.
- Detecta y elimina plugins que borramos de nuestra lista.
- Muestra el estado de los plugins.
- Genera instantáneas de nuestros paquetes con su configuración, con la posibilidad de restaurarlas.
- Posee atajos de teclado.
Si queremos deshabilitar todos los plugins podemos ejecutar nvim --noplugin
.
Algo que puede ser muy útil: poner el listado de plugins en un archivo separado. Esto es: creando un archivo ${XDG_CONFIG_HOME:-$HOME/.config}/nvim/plugins.vim
y en el archivo ${XDG_CONFIG_HOME:-$HOME/.config}/nvim/init.vim
teniendo una simple línea:
runtime plugins.vim
Entonces, comentando esa línea es una manera alternativa para desactivarlos.
Pero hay más: supongamos que tenemos esta configuración en el archivo ${XDG_CONFIG_HOME:-$HOME/.config}/nvim/plugins.vim
:
"nuake plugin Plug 'Lenovsky/nuake' , { 'on': 'Nuake' } nnoremap <F4> :Nuake<CR>
El paquete nuake no se cargará automáticamente en el inicio, pero lo hará cuando usemos el atajo de teclado F4. ¿No es genial?
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.