Cómo rastrear la lentitud
Primero, intenta reproducir el congelamiento o la lentitud. Una vez que puedas reproducir la lentitud de forma consistente, comienza a deshabilitar tus plugins, autocmds y opciones hasta identificar al culpable.
¿Pero qué pasa si nada parece funcionar? ¿Qué pasa si la lentitud solo aparece después de horas de codear? Entonces, amigo mío, profile.nvim será tu nuevo mejor compañero. Cuando notes la lentitud de forma constante, activa profile.nvim
para capturar todo lo que nvim ejecuta. Solo mantén la grabación breve, lo suficientemente larga como para capturar lo que sucede entre tus pulsaciones de tecla.
A continuación, pasa el profile.json
generado a una interfaz gráfica como Perfetto UI. Allí podrás ver qué funciones se ejecutan al presionar j
(o cualquier otra tecla) y cuánto tardan, revelando finalmente al culpable furtivo.
EDIT (Marzo 27, 2025): snacks.nvim incluye un profiler tool, el cual prefiero sobre profile.nvim.
Ajustando opciones
Deshabilitar “built-in syntax highlighting”
He configurado syntax
en manual
para poder seguir utilizando el “syntax highlighting” de nvim para los tipos de archivo que no cuentan con soporte de treesitter. Esta configuración te permite habilitar manualmente “syntax highlighting” para esos tipos de archivo con un autocmd:
vim.cmd.syntax("manual")
Cada vez que un tipo de archivo no soporte treesitter, puedes habilitar su syntax
usando el siguiente autocmd:
vim.api.nvim_create_autocmd("FileType", {
pattern = { "gitsendemail", "conf", "editorconfig", "qf", "checkhealth", "less" },
callback = function(event)
vim.bo[event.buf].syntax = vim.bo[event.buf].filetype
end,
})
Configurando synmaxcol
La opción synmaxcol
limita cuánto de una línea horizontal larga es resaltada por el “nvim’s syntax engine”. Esta configuración es especialmente útil al abrir archivos con líneas extremadamente largas, ya que evita que nvim se congele al intentar resaltar la línea completa:
vim.opt.synmaxcol = 500
Gestión de “signs”
Intenta evitar agregar “signs” siempre que sea posible, ya que pueden añadir sobrecarga en el rendimiento—especialmente cuando se usan con plugins personalizados de la columna de estado como statuscol.nvim. Por ejemplo, yo deshabilito los “diagnostic signs”, ya que a menudo tengo numerosas notificaciones (“hints” y “warnings”) en pantalla. De manera similar, con plugins como gitsigns.nvim
, mostrar signos para archivos nuevos también puede afectar el rendimiento.
Deshabilitar “Inlay Hints” en “Insert Mode”
Las “Inlay Hints” se ejecutan con cada pulsación de tecla. Si tu protocolo de lenguaje (LSP) no es tan bueno, estas actualizaciones frecuentes pueden bloquear nvim. Para mitigar este problema, deshabilita las “Inlay Hints” al entrar en el “Insert Mode” y vuélvelas a habilitar al salir:
vim.api.nvim_create_autocmd("InsertEnter", {
pattern = "*",
callback = function(event)
vim.schedule(function()
vim.lsp.inlay_hint.enable(false, { bufnr = event.buf })
end)
end,
})
vim.api.nvim_create_autocmd("InsertLeave", {
group = utils.augroup("enable_inlay_hints"),
pattern = "*",
callback = function(event)
vim.schedule(function()
vim.lsp.inlay_hint.enable(true, { bufnr = event.buf })
end)
end,
})
LSP
Dado que paso la mayor parte de mi tiempo trabajando con React y Vue, aquí tienes un consejo rápido: si usas el LSP eslint
, configúralo para que se ejecute solo al guardar. Además, considera abandonar ts_ls
a favor de vtsls
.
-- Configuración del LSP eslint
{
settings = {
run = "onSave",
}
}
Algunos LSPs pueden devolver una gran cantidad de sugerencias, como es el caso de vtsls. Esto puede hacer que tu plugin de autocompletado (por ejemplo, blink.cmp, nvim-cmp) se ralentice. Para evitarlo, es recomendable limitar la cantidad de sugerencias que devuelve el LSP. Por ejemplo, para reducir las sugerencias de vtsls
, puedes ajustar su configuración de la siguiente manera:
-- vtsls LSP config
{
settings = {
vtsls = {
experimental = {
completion = {
enableServerSideFuzzyMatch = true,
entriesLimit = 20,
},
},
},
},
}
Ajustando Plugins
nvim-treesitter
Deshabilita el resaltado de nvim-treesitter para archivos que sean demasiado grandes o que sean detectados como minificados. Esto previene problemas de rendimiento al procesar dichos archivos. Además, deshabilita additional_vim_regex_highlighting
:
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
disable = function(_, bufnr)
-- Devuelve true si el buffer es un archivo minificado o si su tamaño es demasiado grande.
end,
},
Puedes ver mi implementación de la función
treesitter.highlight.disable
aquí y aquí.
nvim-tree.lua
Asegúrate de revisar los “Performance Tips” en su página wiki. Si tienes habilitados los filesystem_watchers
, asegúrate de ignorar directorios con una gran cantidad de archivos, como node_modules
. Además, deshabilita la opción modified
, ya que puede causar lentitud en bases de código grandes:
{
filesystem_watchers = {
enable = true,
-- Personalmente, ignoro los directorios `.git` y `.direnv` ya que utilizo https://direnv.net
ignore_dirs = { "node_modules", ".direnv", ".git" },
},
modified = {
enabled = false
}
}
snacks.nvim
Recomiendo encarecidamente reemplazar ciertos plugins con sus equivalentes de Snacks, ya que Snacks es increíblemente rápido, por ejemplo: