Buffers, ventanas y pestañas a fondo
El modelo mental que casi todos malinterpretan: buffer ≠ ventana ≠ pestaña. Domina la gestión de archivos abiertos, splits y layouts sin perderte.
La confusión número uno de quien viene de otros editores: creer que las “pestañas” de Neovim son archivos. No lo son. Entender el modelo buffer / ventana / pestaña te libera para gestionar decenas de archivos y layouts sin caos.
- El modelo mental correcto: buffer, ventana (window) y pestaña (tab).
- Gestionar buffers: listar, saltar, cerrar sin romper el layout.
- Dominar los splits (ventanas) y organizarlos.
- Usar las pestañas como lo que son: layouts, no archivos.
El modelo mental (esto lo cambia todo)
Buffer
Un archivo cargado en memoria. Abres 20 archivos → tienes 20 buffers, aunque solo veas uno.
Ventana (window)
Un “viewport” que muestra un buffer. Un split es una ventana más. Varias ventanas pueden mostrar el mismo buffer.
Pestaña (tab)
Una colección de ventanas, es decir, un layout. NO es un archivo. Piensa en ellas como “escritorios” o espacios de trabajo.
Un buffer es un documento. Una ventana es una hoja de papel donde ves ese documento. Una pestaña es un escritorio con varias hojas colocadas. En VS Code, cada “tab” es un archivo; en Neovim, un archivo es un buffer y una pestaña es todo un layout. Interiorízalo y dejas de pelearte con la gestión de archivos.
Gestionar buffers
Tus archivos abiertos son buffers. Estos son los comandos para moverte entre ellos:
| Comando | Acción |
|---|---|
:ls o :buffers |
lista todos los buffers abiertos |
:b {nombre} |
salta al buffer que coincide (autocompleta con Tab) |
:bn / :bp |
buffer siguiente / anterior |
<C-^> |
alterna entre el buffer actual y el anterior |
:bd |
cierra (delete) el buffer actual |
:bufdo {cmd} |
ejecuta un comando en TODOS los buffers |
En la práctica, no navegas buffers con :bn uno a uno: usas el picker (<leader>fb, del Nivel 3) para saltar difuso a cualquiera. Y para no perder de vista los abiertos, una barra de buffers ayuda:
return {
"akinsho/bufferline.nvim",
event = "VeryLazy",
dependencies = { "nvim-tree/nvim-web-devicons" },
opts = { options = { diagnostics = "nvim_lsp", separator_style = "slant" } },
keys = {
{ "]b", "<cmd>BufferLineCycleNext<cr>", desc = "Buffer siguiente" },
{ "[b", "<cmd>BufferLineCyclePrev<cr>", desc = "Buffer anterior" },
},
}vim.pack.add({
{ src = "https://github.com/nvim-tree/nvim-web-devicons" },
{ src = "https://github.com/akinsho/bufferline.nvim" },
})
vim.o.termguicolors = true
require("bufferline").setup({
options = { diagnostics = "nvim_lsp", separator_style = "slant" },
})
vim.keymap.set("n", "]b", "<cmd>BufferLineCycleNext<cr>", { desc = "Buffer siguiente" })
vim.keymap.set("n", "[b", "<cmd>BufferLineCyclePrev<cr>", { desc = "Buffer anterior" })La barra se ve desde el primer segundo, así que no gana casi nada con carga perezosa: con vim.pack te ahorras la spec entera. Necesita termguicolors activado y una Nerd Font para los iconos.
Media internet mapea el cambio de buffer a <S-h> y <S-l>, que no son teclas libres: son H y L, dos movimientos nativos de Vim (a la línea más alta y más baja de la pantalla). Al robarlos pierdes dos saltos que usas sin pensar, y encima el conflicto es silencioso: H simplemente deja de hacer lo que esperabas. La convención de este track es la de Vim: los saltos entre elementos de una lista van en ] y [ — ]b/[b para buffers, igual que ]q/[q para la quickfix de la lección 4.4 — y las acciones en <leader>. Así ningún plugin pisa a otro, y <C-Space> y <Tab> quedan libres para el autocompletado, que es lo único que debe tenerlos.
:bd cierra el buffer y la ventana si es la única mostrándolo, lo que puede descuadrar tu split. Para cerrar el buffer pero mantener la ventana, usa un plugin como mini.bufremove o la función Snacks.bufdelete() (viene con el snacks.nvim de la lección 3.1). Detalle pequeño, gran diferencia en el día a día.
Ventanas (splits)
Una ventana muestra un buffer. Dividir la pantalla = crear ventanas. Repaso y ampliación de lo del Nivel 1:
| Comando | Acción |
|---|---|
<C-w>s / <C-w>v |
split horizontal / vertical |
<C-w>h/j/k/l |
moverse entre ventanas (recuerda: con tmux/zellij, transparente) |
<C-w>q / <C-w>o |
cerrar ventana / cerrar todas menos la actual |
<C-w>= |
igualar tamaños |
<C-w>H/J/K/L |
mover la ventana a un borde (reorganizar layout) |
<C-w>_ / <C-w>| |
maximizar alto / ancho |
Ver solución
<C-w>v divide en vertical (misma buffer), luego <C-w>l te mueve a la ventana derecha; ahí abres otro archivo con <leader>ff. <C-w>h te devuelve a la izquierda. <C-w>= iguala si quedaron desiguales.
Pestañas (tabs) = layouts
Usa las pestañas para contextos distintos: una pestaña con tu código + tests, otra con documentación + notas. No una pestaña por archivo (para eso están los buffers).
| Comando | Acción |
|---|---|
:tabnew |
nueva pestaña (layout en blanco) |
gt / gT |
pestaña siguiente / anterior |
{n}gt |
ir a la pestaña n |
:tabclose |
cerrar la pestaña |
:tabonly |
cerrar todas menos la actual |
La mayoría de usuarios avanzados viven en buffers + picker y usan pocas pestañas para separar grandes contextos. Si vienes de VS Code y echas de menos “una pestaña por archivo”, instala bufferline: te da esa sensación visual, pero por debajo sigues manejando buffers (que es más potente).
- Abre 4 archivos. Comprueba con
:lsque son 4 buffers. - Salta entre ellos con
<leader>fby con]b/[b(bufferline). - Crea un split vertical y muestra dos buffers a la vez.
- Crea una segunda pestaña con
:tabnew, monta otro layout, y alterna congt. - Cierra un buffer con
Snacks.bufdelete()sin que se descuadre el split.