Skip to main content

Windows and Splits

A window is a viewport into a buffer. You can split the screen into multiple windows, each displaying a different buffer (or even the same buffer at a different position).

Core Idea

Windows are the visual frames. Buffers are the content. Multiple windows can show the same buffer — useful for comparing two sections of a long file.

Creating Splits

:vsplit   :vsvertical split (side by side)
:split :sp → horizontal split (top/bottom)
:vsplit filename → vertical split opening file
:split filename → horizontal split opening file

Keybindings

Ctrl+w v     → vertical split
Ctrl+w s → horizontal split
Ctrl+w n → new empty vertical split
Ctrl+w h     → focus window left
Ctrl+w l → focus window right
Ctrl+w j → focus window below
Ctrl+w k → focus window above
Ctrl+w w → cycle to next window
Ctrl+w p → previous (last focused) window

Vim-style Navigation Keymaps

~/.config/nvim/lua/config/keymaps.lua
-- Navigate splits like tmux panes
vim.keymap.set('n', '<C-h>', '<C-w>h', { desc = "Window left" })
vim.keymap.set('n', '<C-l>', '<C-w>l', { desc = "Window right" })
vim.keymap.set('n', '<C-j>', '<C-w>j', { desc = "Window below" })
vim.keymap.set('n', '<C-k>', '<C-w>k', { desc = "Window above" })

Resizing Windows

Ctrl+w +     → increase height
Ctrl+w - → decrease height
Ctrl+w > → increase width
Ctrl+w < → decrease width
Ctrl+w = → equalize all window sizes
:resize 30set height to 30 lines
:vertical resize 80set width to 80 columns

Moving Windows

Ctrl+w H     → move window to far left
Ctrl+w L → move window to far right
Ctrl+w J → move window to bottom
Ctrl+w K → move window to top
Ctrl+w r → rotate windows
Ctrl+w x → exchange current window with next

Closing Windows

Ctrl+w q     → close current window (close buffer if only window)
Ctrl+w c → close current window (buffer stays in list)
Ctrl+w o → close all OTHER windows (only show current)
:only → keep only current window

Opening the Same Buffer in Two Windows

Useful for comparing two sections of a long file:

:vsplit      → creates a second window of same file
Now scroll each window independently

Diff Mode

Compare two files side by side:

nvim -d file1.lua file2.lua

Or from inside Neovim:

:windo diffthisdiff all visible windows
:diffoff → turn off diff
:diffupdate → refresh diff

Navigation in diff mode:

]c    → next diff change
[c → previous diff change
do → diff obtain (pull from other side)
dp → diff put (push to other side)

Window Layout Example

┌──────────────────┬──────────────────┐
│ │ file2.lua │
│ file1.lua ├──────────────────┤
│ │ terminal │
└──────────────────┴──────────────────┘

Commands to create this:
:vs file2.lua (right split)
Ctrl+w j (or open terminal in bottom-right)
:sp | terminal (horizontal split in right column)

What's Next