wandres.dev
MAESTRO · Dominio profundo del editor

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.

⏱ 15 min

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.

🎯 Al terminar esta lección sabrás
  • 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
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.

El refactor con red de seguridad

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:

folke/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.

⚠️
Ojo con xq y xQ

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.

🚑
trouble.nvimfolke/trouble.nvim

Una vista elegante y navegable de diagnósticos, referencias, symbols y la quickfix. Convierte listas crudas en algo que da gusto recorrer.

opt
⛳ DRILL Renombra una función en todo el proyecto, revisando antes cada coincidencia.
Ver solución
:grep · :copen · :cdo

: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.

⚔️ Edición industrial
  1. Configura grepprg para usar ripgrep.
  2. Añade los atajos ]q / [q.
  3. Busca un término con :grep y navega los resultados con ]q.
  4. Haz un reemplazo en todo el proyecto con :cdo … | update.
  5. Instala trouble.nvim y abre los diagnósticos con <leader>xx y la quickfix con <leader>xQ.