Quickfix y location list a fondo
La lista quickfix es el arma de edición en masa de Neovim: reúne coincidencias de todo el proyecto y aplica cambios o navega errores con precisión industrial.
La quickfix es una lista de ubicaciones — resultados de búsqueda, errores de compilación, referencias del LSP — que puedes navegar y editar en bloque. Es la herramienta que convierte “cambiar esto en 40 archivos” en tres comandos.
- Diferenciar quickfix (global) de location list (por ventana).
- Poblar la lista desde grep, el LSP y el compilador.
- Navegar y editar en masa con
:cdo/:cfdo. - Hacerla cómoda con atajos y trouble.nvim.
Quickfix vs location list
Son casi iguales, con una diferencia de alcance:
Quickfix (global)
Una sola lista por sesión. La usan grep de proyecto, :make, referencias del LSP. Comandos con c: :copen, :cnext.
Location list (local)
Una lista por ventana. Útil para resultados que quieres atados a un split concreto. Comandos con l: :lopen, :lnext.
Poblar la lista
| Fuente | Comando |
|---|---|
| Búsqueda de texto en el proyecto | :grep patrón src/ (usa ripgrep si lo configuras) |
| Coincidencias con regex de Vim | :vimgrep /patrón/ **/*.lua |
| Errores de compilación | :make |
| Diagnósticos del LSP | :lua vim.diagnostic.setqflist() |
| Referencias del LSP | desde el picker o trouble.nvim, con “send to quickfix” |
Para que :grep use ripgrep (rapidísimo), configúralo:
if vim.fn.executable("rg") == 1 then
vim.opt.grepprg = "rg --vimgrep --smart-case"
vim.opt.grepformat = "%f:%l:%c:%m"
end
Navegar la lista
| Comando | Acción |
|---|---|
:copen / :cclose |
abrir / cerrar la ventana de quickfix |
:cnext / :cprev |
siguiente / anterior entrada |
:cfirst / :clast |
primera / última |
:cc {n} |
ir a la entrada n |
Navegar con :cnext a mano es tedioso. Añade atajos cómodos (estilo vim-unimpaired):
local map = vim.keymap.set
map("n", "]q", "<cmd>cnext<cr>", { desc = "Quickfix siguiente" })
map("n", "[q", "<cmd>cprev<cr>", { desc = "Quickfix anterior" })
map("n", "<leader>xq", "<cmd>copen<cr>", { desc = "Abrir quickfix" })
La joya: edición en masa con :cdo
:cdo ejecuta un comando en cada entrada de la quickfix. Combinado con :s, es un buscar-y-reemplazar en todo el proyecto con control total:
" 1) llena la quickfix con todas las apariciones
:grep miVariable src/
" 2) reemplaza en cada una y guarda
:cdo s/miVariable/miNuevoNombre/g | update
:cfdo hace lo mismo pero por archivo (una vez por fichero, no por línea) — útil cuando el comando ya afecta a todo el archivo.
A diferencia de un reemplazo global a ciegas, con la quickfix ves primero todas las coincidencias en :copen, revisas que no haya falsos positivos, y solo entonces lanzas :cdo. Si algo sale mal, u deshace en cada buffer. Es el reemplazo masivo de un profesional: revisas, ejecutas, verificas.
Desde el picker y con trouble.nvim
En el picker de snacks (<leader>fg), puedes seleccionar varios resultados y mandarlos a la quickfix (normalmente con Ctrl-q). Y para una lista mucho más bonita y navegable de diagnósticos, referencias y la propia quickfix, trouble.nvim:
return {
"folke/trouble.nvim",
cmd = "Trouble",
keys = {
{ "<leader>xx", "<cmd>Trouble diagnostics toggle<cr>", desc = "Diagnósticos (Trouble)" },
{ "<leader>xQ", "<cmd>Trouble qflist toggle<cr>", desc = "Quickfix (Trouble)" },
},
opts = {},
}vim.pack.add({ { src = "https://github.com/folke/trouble.nvim" } })
require("trouble").setup({})
vim.keymap.set("n", "<leader>xx", "<cmd>Trouble diagnostics toggle<cr>", { desc = "Diagnósticos (Trouble)" })
vim.keymap.set("n", "<leader>xQ", "<cmd>Trouble qflist toggle<cr>", { desc = "Quickfix (Trouble)" })Trouble solo hace falta cuando lo abres, así que este es un caso claro para lazy.nvim: con cmd y keys no toca el arranque. Con vim.pack se carga siempre, aunque su coste es pequeño.
Arriba mapeaste <leader>xq a :copen, la ventana de quickfix nativa. Si le das a Trouble esa misma tecla, uno de los dos gana según el orden de carga y nunca sabes cuál. Por eso aquí Trouble va en <leader>xQ: la lista nativa en la minúscula, la vista bonita en la mayúscula. Los saltos entre entradas siguen en ]q y [q, que es donde Vim espera los saltos, y ni <C-Space> ni <Tab> entran en juego — esos son del autocompletado y de nadie más.
Una vista elegante y navegable de diagnósticos, referencias, symbols y la quickfix. Convierte listas crudas en algo que da gusto recorrer.
Ver solución
:grep viejoNombre src/ llena la quickfix. :copen para revisar las coincidencias (¿algún falso positivo?). :cdo s/viejoNombre/nuevoNombre/g | update aplica y guarda en todas. Verifica con otro :grep.
- Configura
grepprgpara usar ripgrep. - Añade los atajos
]q/[q. - Busca un término con
:grepy navega los resultados con]q. - Haz un reemplazo en todo el proyecto con
:cdo … | update. - Instala trouble.nvim y abre los diagnósticos con
<leader>xxy la quickfix con<leader>xQ.