wandres.dev
MAESTRO · Dominio profundo del editor

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.

⏱ 14 min

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.

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

La analogía que lo aclara

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:

akinsho/bufferline.nvim
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.

⚠️
Por qué ]b y [b, y no Shift-h y Shift-l

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.

⚠️
El :bd que rompe el layout

: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
⛳ DRILL Abre un archivo en un split vertical a la derecha, edítalo y vuelve al original sin tocar el ratón.
Ver solución
<C-w>v · <C-w>l · … · <C-w>h

<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
💡
¿Buffers o pestañas para organizarme?

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

⚔️ Domina el trío
  1. Abre 4 archivos. Comprueba con :ls que son 4 buffers.
  2. Salta entre ellos con <leader>fb y con ]b/[b (bufferline).
  3. Crea un split vertical y muestra dos buffers a la vez.
  4. Crea una segunda pestaña con :tabnew, monta otro layout, y alterna con gt.
  5. Cierra un buffer con Snacks.bufdelete() sin que se descuadre el split.